@webex/plugin-meetings 3.12.0-next.20 → 3.12.0-next.22

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.
@@ -17,15 +17,15 @@ _Object$defineProperty(exports, "__esModule", {
17
17
  });
18
18
  exports.default = exports.MeetingEndedError = exports.LocusInfoUpdateType = void 0;
19
19
  var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
20
- var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
21
20
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
21
+ var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
22
22
  var _isArray = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/is-array"));
23
23
  var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
24
24
  var _values = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/values"));
25
25
  var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/parse-int"));
26
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
26
27
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
27
28
  var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/typeof"));
28
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
29
29
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
30
30
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
31
31
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
@@ -92,6 +92,10 @@ var HashTreeParser = /*#__PURE__*/function () {
92
92
  (0, _defineProperty2.default)(this, "heartbeatIntervalMs", void 0);
93
93
  (0, _defineProperty2.default)(this, "excludedDataSets", void 0);
94
94
  (0, _defineProperty2.default)(this, "state", void 0);
95
+ (0, _defineProperty2.default)(this, "syncQueue", []);
96
+ (0, _defineProperty2.default)(this, "isSyncInProgress", false);
97
+ (0, _defineProperty2.default)(this, "isSyncAllInProgress", false);
98
+ (0, _defineProperty2.default)(this, "syncQueueProcessingPromise", _promise.default.resolve());
95
99
  var _options$initialLocus = options.initialLocus,
96
100
  dataSets = _options$initialLocus.dataSets,
97
101
  locus = _options$initialLocus.locus; // extract dataSets from initialLocus
@@ -212,72 +216,54 @@ var HashTreeParser = /*#__PURE__*/function () {
212
216
  */
213
217
  }, {
214
218
  key: "initializeNewVisibleDataSet",
215
- value: function initializeNewVisibleDataSet(visibleDataSetInfo, dataSetInfo) {
216
- if (this.isVisibleDataSet(dataSetInfo.name)) {
217
- _loggerProxy.default.logger.info("HashTreeParser#initializeNewVisibleDataSet --> ".concat(this.debugId, " Data set \"").concat(dataSetInfo.name, "\" already exists, skipping init"));
218
- return _promise.default.resolve({
219
- updateType: LocusInfoUpdateType.OBJECTS_UPDATED,
220
- updatedObjects: []
221
- });
222
- }
223
- _loggerProxy.default.logger.info("HashTreeParser#initializeNewVisibleDataSet --> ".concat(this.debugId, " Adding visible data set \"").concat(dataSetInfo.name, "\""));
224
- if (!this.addToVisibleDataSetsList(visibleDataSetInfo)) {
225
- return _promise.default.resolve({
226
- updateType: LocusInfoUpdateType.OBJECTS_UPDATED,
227
- updatedObjects: []
228
- });
229
- }
230
- var hashTree = new _hashTree.default([], dataSetInfo.leafCount);
231
- this.dataSets[dataSetInfo.name] = _objectSpread(_objectSpread({}, dataSetInfo), {}, {
232
- hashTree: hashTree
233
- });
234
- return this.sendInitializationSyncRequestToLocus(dataSetInfo.name, 'new visible data set');
235
- }
236
-
237
- /**
238
- * Sends a special sync request to Locus with all leaves empty - this is a way to get all the data for a given dataset.
239
- *
240
- * @param {string} datasetName - name of the dataset for which to send the request
241
- * @param {string} debugText - text to include in logs
242
- * @returns {Promise}
243
- */
244
- }, {
245
- key: "sendInitializationSyncRequestToLocus",
246
- value: function sendInitializationSyncRequestToLocus(datasetName, debugText) {
247
- var _this2 = this;
248
- var dataset = this.dataSets[datasetName];
249
- if (!dataset) {
250
- _loggerProxy.default.logger.warn("HashTreeParser#sendInitializationSyncRequestToLocus --> ".concat(this.debugId, " No data set found for ").concat(datasetName, ", cannot send the request for leaf data"));
251
- return _promise.default.resolve({
252
- updateType: LocusInfoUpdateType.OBJECTS_UPDATED,
253
- updatedObjects: []
254
- });
219
+ value: (function () {
220
+ var _initializeNewVisibleDataSet = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(visibleDataSetInfo, dataSetInfo) {
221
+ var hashTree;
222
+ return _regenerator.default.wrap(function (_context) {
223
+ while (1) switch (_context.prev = _context.next) {
224
+ case 0:
225
+ if (!this.isVisibleDataSet(dataSetInfo.name)) {
226
+ _context.next = 1;
227
+ break;
228
+ }
229
+ _loggerProxy.default.logger.info("HashTreeParser#initializeNewVisibleDataSet --> ".concat(this.debugId, " Data set \"").concat(dataSetInfo.name, "\" already exists, skipping init"));
230
+ return _context.abrupt("return");
231
+ case 1:
232
+ _loggerProxy.default.logger.info("HashTreeParser#initializeNewVisibleDataSet --> ".concat(this.debugId, " Adding visible data set \"").concat(dataSetInfo.name, "\""));
233
+ if (this.addToVisibleDataSetsList(visibleDataSetInfo)) {
234
+ _context.next = 2;
235
+ break;
236
+ }
237
+ return _context.abrupt("return");
238
+ case 2:
239
+ hashTree = new _hashTree.default([], dataSetInfo.leafCount);
240
+ this.dataSets[dataSetInfo.name] = _objectSpread(_objectSpread({}, dataSetInfo), {}, {
241
+ hashTree: hashTree
242
+ });
243
+ this.enqueueSyncForDataset(dataSetInfo.name, 'new visible data set initialization', true);
244
+ _context.next = 3;
245
+ return this.syncQueueProcessingPromise;
246
+ case 3:
247
+ case "end":
248
+ return _context.stop();
249
+ }
250
+ }, _callee, this);
251
+ }));
252
+ function initializeNewVisibleDataSet(_x, _x2) {
253
+ return _initializeNewVisibleDataSet.apply(this, arguments);
255
254
  }
256
- var emptyLeavesData = new Array(dataset.leafCount).fill([]);
257
- _loggerProxy.default.logger.info("HashTreeParser#sendInitializationSyncRequestToLocus --> ".concat(this.debugId, " Sending initial sync request to Locus for data set \"").concat(datasetName, "\" with empty leaf data"));
258
- return this.sendSyncRequestToLocus(this.dataSets[datasetName], emptyLeavesData).then(function (syncResponse) {
259
- if (syncResponse) {
260
- return {
261
- updateType: LocusInfoUpdateType.OBJECTS_UPDATED,
262
- updatedObjects: _this2.parseMessage(syncResponse, "via empty leaves /sync API call for ".concat(debugText))
263
- };
264
- }
265
- return {
266
- updateType: LocusInfoUpdateType.OBJECTS_UPDATED,
267
- updatedObjects: []
268
- };
269
- });
270
- }
271
-
255
+ return initializeNewVisibleDataSet;
256
+ }()
272
257
  /**
273
258
  * Queries Locus for all up-to-date information about all visible data sets
274
259
  *
275
260
  * @returns {Promise}
276
261
  */
262
+ )
277
263
  }, {
278
264
  key: "getAllVisibleDataSetsFromLocus",
279
265
  value: function getAllVisibleDataSetsFromLocus() {
280
- var _this3 = this;
266
+ var _this2 = this;
281
267
  if (!this.visibleDataSetsUrl) {
282
268
  _loggerProxy.default.logger.warn("HashTreeParser#getAllVisibleDataSetsFromLocus --> ".concat(this.debugId, " No visibleDataSetsUrl, cannot get data sets information"));
283
269
  return _promise.default.resolve([]);
@@ -288,7 +274,7 @@ var HashTreeParser = /*#__PURE__*/function () {
288
274
  }).then(function (response) {
289
275
  return response.body.dataSets;
290
276
  }).catch(function (error) {
291
- _this3.checkForSentinelHttpResponse(error);
277
+ _this2.checkForSentinelHttpResponse(error);
292
278
  throw error;
293
279
  });
294
280
  }
@@ -302,26 +288,26 @@ var HashTreeParser = /*#__PURE__*/function () {
302
288
  }, {
303
289
  key: "initializeFromMessage",
304
290
  value: (function () {
305
- var _initializeFromMessage = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(message) {
291
+ var _initializeFromMessage = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2(message) {
306
292
  var visibleDataSets;
307
- return _regenerator.default.wrap(function (_context) {
308
- while (1) switch (_context.prev = _context.next) {
293
+ return _regenerator.default.wrap(function (_context2) {
294
+ while (1) switch (_context2.prev = _context2.next) {
309
295
  case 0:
310
296
  this.visibleDataSetsUrl = message.visibleDataSetsUrl;
311
297
  _loggerProxy.default.logger.info("HashTreeParser#initializeFromMessage --> ".concat(this.debugId, " visibleDataSetsUrl=").concat(this.visibleDataSetsUrl));
312
- _context.next = 1;
298
+ _context2.next = 1;
313
299
  return this.getAllVisibleDataSetsFromLocus();
314
300
  case 1:
315
- visibleDataSets = _context.sent;
316
- _context.next = 2;
301
+ visibleDataSets = _context2.sent;
302
+ _context2.next = 2;
317
303
  return this.initializeDataSets(visibleDataSets, 'initialization from message');
318
304
  case 2:
319
305
  case "end":
320
- return _context.stop();
306
+ return _context2.stop();
321
307
  }
322
- }, _callee, this);
308
+ }, _callee2, this);
323
309
  }));
324
- function initializeFromMessage(_x) {
310
+ function initializeFromMessage(_x3) {
325
311
  return _initializeFromMessage.apply(this, arguments);
326
312
  }
327
313
  return initializeFromMessage;
@@ -339,34 +325,34 @@ var HashTreeParser = /*#__PURE__*/function () {
339
325
  }, {
340
326
  key: "initializeFromGetLociResponse",
341
327
  value: (function () {
342
- var _initializeFromGetLociResponse = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2(locus) {
328
+ var _initializeFromGetLociResponse = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3(locus) {
343
329
  var _locus$links2, _locus$links2$resourc, _locus$links2$resourc2;
344
330
  var visibleDataSets;
345
- return _regenerator.default.wrap(function (_context2) {
346
- while (1) switch (_context2.prev = _context2.next) {
331
+ return _regenerator.default.wrap(function (_context3) {
332
+ while (1) switch (_context3.prev = _context3.next) {
347
333
  case 0:
348
334
  if (locus !== null && locus !== void 0 && (_locus$links2 = locus.links) !== null && _locus$links2 !== void 0 && (_locus$links2$resourc = _locus$links2.resources) !== null && _locus$links2$resourc !== void 0 && (_locus$links2$resourc2 = _locus$links2$resourc.visibleDataSets) !== null && _locus$links2$resourc2 !== void 0 && _locus$links2$resourc2.url) {
349
- _context2.next = 1;
335
+ _context3.next = 1;
350
336
  break;
351
337
  }
352
338
  _loggerProxy.default.logger.warn("HashTreeParser#initializeFromGetLociResponse --> ".concat(this.debugId, " missing visibleDataSets url in GET Loci response, cannot initialize hash trees"));
353
- return _context2.abrupt("return");
339
+ return _context3.abrupt("return");
354
340
  case 1:
355
341
  this.visibleDataSetsUrl = locus.links.resources.visibleDataSets.url;
356
342
  _loggerProxy.default.logger.info("HashTreeParser#initializeFromGetLociResponse --> ".concat(this.debugId, " visibleDataSets url: ").concat(this.visibleDataSetsUrl));
357
- _context2.next = 2;
343
+ _context3.next = 2;
358
344
  return this.getAllVisibleDataSetsFromLocus();
359
345
  case 2:
360
- visibleDataSets = _context2.sent;
361
- _context2.next = 3;
346
+ visibleDataSets = _context3.sent;
347
+ _context3.next = 3;
362
348
  return this.initializeDataSets(visibleDataSets, 'initialization from GET /loci response');
363
349
  case 3:
364
350
  case "end":
365
- return _context2.stop();
351
+ return _context3.stop();
366
352
  }
367
- }, _callee2, this);
353
+ }, _callee3, this);
368
354
  }));
369
- function initializeFromGetLociResponse(_x2) {
355
+ function initializeFromGetLociResponse(_x4) {
370
356
  return _initializeFromGetLociResponse.apply(this, arguments);
371
357
  }
372
358
  return initializeFromGetLociResponse;
@@ -382,24 +368,23 @@ var HashTreeParser = /*#__PURE__*/function () {
382
368
  }, {
383
369
  key: "initializeDataSets",
384
370
  value: (function () {
385
- var _initializeDataSets = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3(visibleDataSets, debugText) {
386
- var updatedObjects, _iterator2, _step2, dataSet, name, leafCount, url, data, _t;
387
- return _regenerator.default.wrap(function (_context3) {
388
- while (1) switch (_context3.prev = _context3.next) {
371
+ var _initializeDataSets = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4(visibleDataSets, debugText) {
372
+ var _iterator2, _step2, dataSet, name, leafCount, url, _t;
373
+ return _regenerator.default.wrap(function (_context4) {
374
+ while (1) switch (_context4.prev = _context4.next) {
389
375
  case 0:
390
376
  if (!(this.state === 'stopped')) {
391
- _context3.next = 1;
377
+ _context4.next = 1;
392
378
  break;
393
379
  }
394
- return _context3.abrupt("return");
380
+ return _context4.abrupt("return");
395
381
  case 1:
396
- updatedObjects = [];
397
382
  _iterator2 = _createForOfIteratorHelper((0, _utils.sortByInitPriority)(visibleDataSets, _constants2.DATA_SET_INIT_PRIORITY));
398
- _context3.prev = 2;
383
+ _context4.prev = 2;
399
384
  _iterator2.s();
400
385
  case 3:
401
386
  if ((_step2 = _iterator2.n()).done) {
402
- _context3.next = 7;
387
+ _context4.next = 6;
403
388
  break;
404
389
  }
405
390
  dataSet = _step2.value;
@@ -411,59 +396,47 @@ var HashTreeParser = /*#__PURE__*/function () {
411
396
  _loggerProxy.default.logger.info("HashTreeParser#initializeDataSets --> ".concat(this.debugId, " dataset \"").concat(name, "\" already exists (").concat(debugText, ")"));
412
397
  }
413
398
  if (this.isVisibleDataSet(name)) {
414
- _context3.next = 4;
399
+ _context4.next = 4;
415
400
  break;
416
401
  }
417
402
  if (this.addToVisibleDataSetsList({
418
403
  name: name,
419
404
  url: url
420
405
  })) {
421
- _context3.next = 4;
406
+ _context4.next = 4;
422
407
  break;
423
408
  }
424
- return _context3.abrupt("continue", 6);
409
+ return _context4.abrupt("continue", 5);
425
410
  case 4:
426
- if (this.dataSets[name].hashTree) {
427
- _context3.next = 6;
428
- break;
411
+ if (!this.dataSets[name].hashTree) {
412
+ _loggerProxy.default.logger.info("HashTreeParser#initializeDataSets --> ".concat(this.debugId, " creating hash tree for visible dataset \"").concat(name, "\" (").concat(debugText, ")"));
413
+ this.dataSets[name].hashTree = new _hashTree.default([], leafCount);
414
+ this.enqueueSyncForDataset(name, "initialization sync for ".concat(debugText), true);
429
415
  }
430
- _loggerProxy.default.logger.info("HashTreeParser#initializeDataSets --> ".concat(this.debugId, " creating hash tree for visible dataset \"").concat(name, "\" (").concat(debugText, ")"));
431
- this.dataSets[name].hashTree = new _hashTree.default([], leafCount);
432
-
433
- // eslint-disable-next-line no-await-in-loop
434
- _context3.next = 5;
435
- return this.sendInitializationSyncRequestToLocus(name, debugText);
436
416
  case 5:
437
- data = _context3.sent;
438
- if (data.updateType === LocusInfoUpdateType.OBJECTS_UPDATED) {
439
- updatedObjects.push.apply(updatedObjects, (0, _toConsumableArray2.default)(data.updatedObjects || []));
440
- }
417
+ _context4.next = 3;
418
+ break;
441
419
  case 6:
442
- _context3.next = 3;
420
+ _context4.next = 8;
443
421
  break;
444
422
  case 7:
445
- _context3.next = 9;
446
- break;
447
- case 8:
448
- _context3.prev = 8;
449
- _t = _context3["catch"](2);
423
+ _context4.prev = 7;
424
+ _t = _context4["catch"](2);
450
425
  _iterator2.e(_t);
451
- case 9:
452
- _context3.prev = 9;
426
+ case 8:
427
+ _context4.prev = 8;
453
428
  _iterator2.f();
454
- return _context3.finish(9);
429
+ return _context4.finish(8);
430
+ case 9:
431
+ _context4.next = 10;
432
+ return this.syncQueueProcessingPromise;
455
433
  case 10:
456
- this.callLocusInfoUpdateCallback({
457
- updateType: LocusInfoUpdateType.OBJECTS_UPDATED,
458
- updatedObjects: updatedObjects
459
- });
460
- case 11:
461
434
  case "end":
462
- return _context3.stop();
435
+ return _context4.stop();
463
436
  }
464
- }, _callee3, this, [[2, 8, 9, 10]]);
437
+ }, _callee4, this, [[2, 7, 8, 9]]);
465
438
  }));
466
- function initializeDataSets(_x3, _x4) {
439
+ function initializeDataSets(_x5, _x6) {
467
440
  return _initializeDataSets.apply(this, arguments);
468
441
  }
469
442
  return initializeDataSets;
@@ -599,9 +572,9 @@ var HashTreeParser = /*#__PURE__*/function () {
599
572
  }, {
600
573
  key: "isEndMessage",
601
574
  value: function isEndMessage(message) {
602
- var _this4 = this;
575
+ var _this3 = this;
603
576
  return message.dataSets.some(function (dataSet) {
604
- if (dataSet.leafCount === 1 && dataSet.root === _constants2.EMPTY_HASH && (!_this4.dataSets[dataSet.name] || _this4.dataSets[dataSet.name].version < dataSet.version) && PossibleSentinelMessageDataSetNames.includes(dataSet.name.toLowerCase())) {
577
+ if (dataSet.leafCount === 1 && dataSet.root === _constants2.EMPTY_HASH && (!_this3.dataSets[dataSet.name] || _this3.dataSets[dataSet.name].version < dataSet.version) && PossibleSentinelMessageDataSetNames.includes(dataSet.name.toLowerCase())) {
605
578
  // this is a special way for Locus to indicate that this meeting has ended
606
579
  return true;
607
580
  }
@@ -618,7 +591,7 @@ var HashTreeParser = /*#__PURE__*/function () {
618
591
  }, {
619
592
  key: "handleRootHashHeartBeatMessage",
620
593
  value: function handleRootHashHeartBeatMessage(message) {
621
- var _this5 = this;
594
+ var _this4 = this;
622
595
  var dataSets = message.dataSets;
623
596
  _loggerProxy.default.logger.info("HashTreeParser#handleRootHashMessage --> ".concat(this.debugId, " Received heartbeat root hash message with data sets: ").concat((0, _stringify.default)(dataSets.map(function (_ref2) {
624
597
  var name = _ref2.name,
@@ -633,8 +606,8 @@ var HashTreeParser = /*#__PURE__*/function () {
633
606
  };
634
607
  }))));
635
608
  dataSets.forEach(function (dataSet) {
636
- _this5.updateDataSetInfo(dataSet);
637
- _this5.runSyncAlgorithm(dataSet);
609
+ _this4.updateDataSetInfo(dataSet);
610
+ _this4.runSyncAlgorithm(dataSet);
638
611
  });
639
612
  }
640
613
 
@@ -647,18 +620,18 @@ var HashTreeParser = /*#__PURE__*/function () {
647
620
  }, {
648
621
  key: "queueInitForNewVisibleDataSets",
649
622
  value: function queueInitForNewVisibleDataSets(dataSetsRequiringInitialization) {
650
- var _this6 = this;
623
+ var _this5 = this;
651
624
  _loggerProxy.default.logger.info("HashTreeParser#queueInitForNewVisibleDataSets --> ".concat(this.debugId, " queuing initialization of new visible datasets: ").concat(dataSetsRequiringInitialization.map(function (ds) {
652
625
  return ds.name;
653
626
  }).join(', ')));
654
627
  queueMicrotask(function () {
655
- _this6.initializeNewVisibleDataSets(dataSetsRequiringInitialization).catch(function (error) {
628
+ _this5.initializeNewVisibleDataSets(dataSetsRequiringInitialization).catch(function (error) {
656
629
  if (error instanceof MeetingEndedError) {
657
- _this6.callLocusInfoUpdateCallback({
630
+ _this5.callLocusInfoUpdateCallback({
658
631
  updateType: LocusInfoUpdateType.MEETING_ENDED
659
632
  });
660
633
  } else {
661
- _loggerProxy.default.logger.warn("HashTreeParser#queueInitForNewVisibleDataSets --> ".concat(_this6.debugId, " error while initializing new visible datasets: ").concat(dataSetsRequiringInitialization.map(function (ds) {
634
+ _loggerProxy.default.logger.warn("HashTreeParser#queueInitForNewVisibleDataSets --> ".concat(_this5.debugId, " error while initializing new visible datasets: ").concat(dataSetsRequiringInitialization.map(function (ds) {
662
635
  return ds.name;
663
636
  }).join(', '), ": "), error);
664
637
  }
@@ -718,7 +691,7 @@ var HashTreeParser = /*#__PURE__*/function () {
718
691
  }, {
719
692
  key: "handleLocusUpdate",
720
693
  value: function handleLocusUpdate(update) {
721
- var _this7 = this;
694
+ var _this6 = this;
722
695
  if (this.state === 'stopped') {
723
696
  return;
724
697
  }
@@ -726,6 +699,7 @@ var HashTreeParser = /*#__PURE__*/function () {
726
699
  locus = update.locus,
727
700
  metadata = update.metadata;
728
701
  if (!dataSets) {
702
+ // this happens for example when we handle GET /loci response
729
703
  _loggerProxy.default.logger.info("HashTreeParser#handleLocusUpdate --> ".concat(this.debugId, " received hash tree update without dataSets"));
730
704
  } else {
731
705
  var _iterator5 = _createForOfIteratorHelper(dataSets),
@@ -755,9 +729,9 @@ var HashTreeParser = /*#__PURE__*/function () {
755
729
 
756
730
  // then process the data in hash trees, if it is a new version, then add it to updatedObjects
757
731
  (0, _keys.default)(leafInfo).forEach(function (dataSetName) {
758
- if (_this7.dataSets[dataSetName]) {
759
- if (_this7.dataSets[dataSetName].hashTree) {
760
- var appliedChangesList = _this7.dataSets[dataSetName].hashTree.putItems(leafInfo[dataSetName].map(function (leaf) {
732
+ if (_this6.dataSets[dataSetName]) {
733
+ if (_this6.dataSets[dataSetName].hashTree) {
734
+ var appliedChangesList = _this6.dataSets[dataSetName].hashTree.putItems(leafInfo[dataSetName].map(function (leaf) {
761
735
  return {
762
736
  id: leaf.id,
763
737
  type: leaf.type,
@@ -784,10 +758,10 @@ var HashTreeParser = /*#__PURE__*/function () {
784
758
  });
785
759
  } else {
786
760
  // no hash tree means that the data set is not visible
787
- _loggerProxy.default.logger.warn("HashTreeParser#handleLocusUpdate --> ".concat(_this7.debugId, " received leaf data for data set \"").concat(dataSetName, "\" that has no hash tree created, ignoring"));
761
+ _loggerProxy.default.logger.warn("HashTreeParser#handleLocusUpdate --> ".concat(_this6.debugId, " received leaf data for data set \"").concat(dataSetName, "\" that has no hash tree created, ignoring"));
788
762
  }
789
763
  } else {
790
- _loggerProxy.default.logger.info("HashTreeParser#handleLocusUpdate --> ".concat(_this7.debugId, " received leaf data for unknown data set \"").concat(dataSetName, "\", ignoring"));
764
+ _loggerProxy.default.logger.info("HashTreeParser#handleLocusUpdate --> ".concat(_this6.debugId, " received leaf data for unknown data set \"").concat(dataSetName, "\", ignoring"));
791
765
  }
792
766
  });
793
767
  if (updatedObjects.length === 0) {
@@ -835,7 +809,7 @@ var HashTreeParser = /*#__PURE__*/function () {
835
809
  }, {
836
810
  key: "checkForVisibleDataSetChanges",
837
811
  value: function checkForVisibleDataSetChanges(updatedObjects) {
838
- var _this8 = this;
812
+ var _this7 = this;
839
813
  var removedDataSets = [];
840
814
  var addedDataSets = [];
841
815
 
@@ -844,20 +818,20 @@ var HashTreeParser = /*#__PURE__*/function () {
844
818
  var _object$data;
845
819
  if ((0, _utils.isMetadata)(object) && (_object$data = object.data) !== null && _object$data !== void 0 && _object$data.visibleDataSets) {
846
820
  var newVisibleDataSets = object.data.visibleDataSets.filter(function (vds) {
847
- return !_this8.isExcludedDataSet(vds.name);
821
+ return !_this7.isExcludedDataSet(vds.name);
848
822
  });
849
- removedDataSets = _this8.visibleDataSets.filter(function (ds) {
823
+ removedDataSets = _this7.visibleDataSets.filter(function (ds) {
850
824
  return !newVisibleDataSets.some(function (nvs) {
851
825
  return nvs.name === ds.name;
852
826
  });
853
827
  });
854
828
  addedDataSets = newVisibleDataSets.filter(function (nvs) {
855
- return _this8.visibleDataSets.every(function (ds) {
829
+ return _this7.visibleDataSets.every(function (ds) {
856
830
  return ds.name !== nvs.name;
857
831
  });
858
832
  });
859
833
  if (removedDataSets.length > 0 || addedDataSets.length > 0) {
860
- _loggerProxy.default.logger.info("HashTreeParser#checkForVisibleDataSetChanges --> ".concat(_this8.debugId, " visible data sets change: removed: ").concat(removedDataSets.map(function (ds) {
834
+ _loggerProxy.default.logger.info("HashTreeParser#checkForVisibleDataSetChanges --> ".concat(_this7.debugId, " visible data sets change: removed: ").concat(removedDataSets.map(function (ds) {
861
835
  return ds.name;
862
836
  }).join(', '), ", added: ").concat(addedDataSets.map(function (ds) {
863
837
  return ds.name;
@@ -911,16 +885,16 @@ var HashTreeParser = /*#__PURE__*/function () {
911
885
  }, {
912
886
  key: "processVisibleDataSetChanges",
913
887
  value: function processVisibleDataSetChanges(removedDataSets, addedDataSets, updatedObjects) {
914
- var _this9 = this;
888
+ var _this8 = this;
915
889
  var dataSetsRequiringInitialization = [];
916
890
 
917
891
  // if a visible data set was removed, we need to tell our client that all objects from it are removed
918
892
  var removedObjects = [];
919
893
  removedDataSets.forEach(function (ds) {
920
- var _this9$dataSets$ds$na;
921
- if ((_this9$dataSets$ds$na = _this9.dataSets[ds.name]) !== null && _this9$dataSets$ds$na !== void 0 && _this9$dataSets$ds$na.hashTree) {
922
- for (var i = 0; i < _this9.dataSets[ds.name].hashTree.numLeaves; i += 1) {
923
- removedObjects.push.apply(removedObjects, (0, _toConsumableArray2.default)(_this9.dataSets[ds.name].hashTree.getLeafData(i).map(function (elementId) {
894
+ var _this8$dataSets$ds$na;
895
+ if ((_this8$dataSets$ds$na = _this8.dataSets[ds.name]) !== null && _this8$dataSets$ds$na !== void 0 && _this8$dataSets$ds$na.hashTree) {
896
+ for (var i = 0; i < _this8.dataSets[ds.name].hashTree.numLeaves; i += 1) {
897
+ removedObjects.push.apply(removedObjects, (0, _toConsumableArray2.default)(_this8.dataSets[ds.name].hashTree.getLeafData(i).map(function (elementId) {
924
898
  return {
925
899
  htMeta: {
926
900
  elementId: elementId,
@@ -930,7 +904,7 @@ var HashTreeParser = /*#__PURE__*/function () {
930
904
  };
931
905
  })));
932
906
  }
933
- _this9.deleteHashTree(ds.name);
907
+ _this8.deleteHashTree(ds.name);
934
908
  }
935
909
  });
936
910
  this.visibleDataSets = this.visibleDataSets.filter(function (vds) {
@@ -991,81 +965,78 @@ var HashTreeParser = /*#__PURE__*/function () {
991
965
  }, {
992
966
  key: "initializeNewVisibleDataSets",
993
967
  value: (function () {
994
- var _initializeNewVisibleDataSets = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4(addedDataSets) {
995
- var _this0 = this;
968
+ var _initializeNewVisibleDataSets = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee5(addedDataSets) {
969
+ var _this9 = this;
996
970
  var allDataSets, _iterator7, _step7, _loop, _t2;
997
- return _regenerator.default.wrap(function (_context5) {
998
- while (1) switch (_context5.prev = _context5.next) {
971
+ return _regenerator.default.wrap(function (_context6) {
972
+ while (1) switch (_context6.prev = _context6.next) {
999
973
  case 0:
1000
974
  if (!(this.state === 'stopped')) {
1001
- _context5.next = 1;
975
+ _context6.next = 1;
1002
976
  break;
1003
977
  }
1004
- return _context5.abrupt("return");
978
+ return _context6.abrupt("return");
1005
979
  case 1:
1006
- _context5.next = 2;
980
+ _context6.next = 2;
1007
981
  return this.getAllVisibleDataSetsFromLocus();
1008
982
  case 2:
1009
- allDataSets = _context5.sent;
983
+ allDataSets = _context6.sent;
1010
984
  _iterator7 = _createForOfIteratorHelper((0, _utils.sortByInitPriority)(addedDataSets, _constants2.DATA_SET_INIT_PRIORITY));
1011
- _context5.prev = 3;
985
+ _context6.prev = 3;
1012
986
  _loop = /*#__PURE__*/_regenerator.default.mark(function _loop() {
1013
- var ds, dataSetInfo, updates;
1014
- return _regenerator.default.wrap(function (_context4) {
1015
- while (1) switch (_context4.prev = _context4.next) {
987
+ var ds, dataSetInfo;
988
+ return _regenerator.default.wrap(function (_context5) {
989
+ while (1) switch (_context5.prev = _context5.next) {
1016
990
  case 0:
1017
991
  ds = _step7.value;
1018
992
  dataSetInfo = allDataSets.find(function (d) {
1019
993
  return d.name === ds.name;
1020
994
  });
1021
- _loggerProxy.default.logger.info("HashTreeParser#initializeNewVisibleDataSets --> ".concat(_this0.debugId, " initializing data set \"").concat(ds.name, "\""));
995
+ _loggerProxy.default.logger.info("HashTreeParser#initializeNewVisibleDataSets --> ".concat(_this9.debugId, " initializing data set \"").concat(ds.name, "\""));
1022
996
  if (dataSetInfo) {
1023
- _context4.next = 1;
997
+ _context5.next = 1;
1024
998
  break;
1025
999
  }
1026
- _loggerProxy.default.logger.warn("HashTreeParser#initializeNewVisibleDataSets --> ".concat(_this0.debugId, " missing info about data set \"").concat(ds.name, "\" in Locus response from visibleDataSetsUrl"));
1027
- _context4.next = 3;
1000
+ _loggerProxy.default.logger.warn("HashTreeParser#initializeNewVisibleDataSets --> ".concat(_this9.debugId, " missing info about data set \"").concat(ds.name, "\" in Locus response from visibleDataSetsUrl"));
1001
+ _context5.next = 2;
1028
1002
  break;
1029
1003
  case 1:
1030
- _context4.next = 2;
1031
- return _this0.initializeNewVisibleDataSet(ds, dataSetInfo);
1004
+ _context5.next = 2;
1005
+ return _this9.initializeNewVisibleDataSet(ds, dataSetInfo);
1032
1006
  case 2:
1033
- updates = _context4.sent;
1034
- _this0.callLocusInfoUpdateCallback(updates);
1035
- case 3:
1036
1007
  case "end":
1037
- return _context4.stop();
1008
+ return _context5.stop();
1038
1009
  }
1039
1010
  }, _loop);
1040
1011
  });
1041
1012
  _iterator7.s();
1042
1013
  case 4:
1043
1014
  if ((_step7 = _iterator7.n()).done) {
1044
- _context5.next = 6;
1015
+ _context6.next = 6;
1045
1016
  break;
1046
1017
  }
1047
- return _context5.delegateYield(_loop(), "t0", 5);
1018
+ return _context6.delegateYield(_loop(), "t0", 5);
1048
1019
  case 5:
1049
- _context5.next = 4;
1020
+ _context6.next = 4;
1050
1021
  break;
1051
1022
  case 6:
1052
- _context5.next = 8;
1023
+ _context6.next = 8;
1053
1024
  break;
1054
1025
  case 7:
1055
- _context5.prev = 7;
1056
- _t2 = _context5["catch"](3);
1026
+ _context6.prev = 7;
1027
+ _t2 = _context6["catch"](3);
1057
1028
  _iterator7.e(_t2);
1058
1029
  case 8:
1059
- _context5.prev = 8;
1030
+ _context6.prev = 8;
1060
1031
  _iterator7.f();
1061
- return _context5.finish(8);
1032
+ return _context6.finish(8);
1062
1033
  case 9:
1063
1034
  case "end":
1064
- return _context5.stop();
1035
+ return _context6.stop();
1065
1036
  }
1066
- }, _callee4, this, [[3, 7, 8, 9]]);
1037
+ }, _callee5, this, [[3, 7, 8, 9]]);
1067
1038
  }));
1068
- function initializeNewVisibleDataSets(_x5) {
1039
+ function initializeNewVisibleDataSets(_x7) {
1069
1040
  return _initializeNewVisibleDataSets.apply(this, arguments);
1070
1041
  }
1071
1042
  return initializeNewVisibleDataSets;
@@ -1082,7 +1053,7 @@ var HashTreeParser = /*#__PURE__*/function () {
1082
1053
  key: "parseMessage",
1083
1054
  value: function parseMessage(message, debugText) {
1084
1055
  var _message$locusStateEl,
1085
- _this1 = this;
1056
+ _this0 = this;
1086
1057
  if (this.state === 'stopped') {
1087
1058
  return [];
1088
1059
  }
@@ -1097,7 +1068,7 @@ var HashTreeParser = /*#__PURE__*/function () {
1097
1068
  // first, update our metadata about the datasets with info from the message
1098
1069
  this.visibleDataSetsUrl = visibleDataSetsUrl;
1099
1070
  dataSets.forEach(function (dataSet) {
1100
- return _this1.updateDataSetInfo(dataSet);
1071
+ return _this0.updateDataSetInfo(dataSet);
1101
1072
  });
1102
1073
  var updatedObjects = [];
1103
1074
 
@@ -1117,9 +1088,9 @@ var HashTreeParser = /*#__PURE__*/function () {
1117
1088
  _step8;
1118
1089
  try {
1119
1090
  for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
1120
- var _this1$dataSets$dataS;
1091
+ var _this0$dataSets$dataS;
1121
1092
  var dataSetName = _step8.value;
1122
- var hashTree = (_this1$dataSets$dataS = _this1.dataSets[dataSetName]) === null || _this1$dataSets$dataS === void 0 ? void 0 : _this1$dataSets$dataS.hashTree;
1093
+ var hashTree = (_this0$dataSets$dataS = _this0.dataSets[dataSetName]) === null || _this0$dataSets$dataS === void 0 ? void 0 : _this0$dataSets$dataS.hashTree;
1123
1094
  if (hashTree && object.data) {
1124
1095
  if (hashTree.putItem(object.htMeta.elementId)) {
1125
1096
  updatedMetadataObjects.push(object);
@@ -1146,8 +1117,8 @@ var HashTreeParser = /*#__PURE__*/function () {
1146
1117
  // and hash trees created for the new visible data sets,
1147
1118
  // so we can now process all the updates from the message
1148
1119
  dataSets.forEach(function (dataSet) {
1149
- if (_this1.dataSets[dataSet.name]) {
1150
- var hashTree = _this1.dataSets[dataSet.name].hashTree;
1120
+ if (_this0.dataSets[dataSet.name]) {
1121
+ var hashTree = _this0.dataSets[dataSet.name].hashTree;
1151
1122
  if (hashTree) {
1152
1123
  var locusStateElementsForThisSet = message.locusStateElements.filter(function (object) {
1153
1124
  return object.htMeta.dataSetNames.includes(dataSet.name);
@@ -1171,10 +1142,10 @@ var HashTreeParser = /*#__PURE__*/function () {
1171
1142
  }
1172
1143
  });
1173
1144
  } else {
1174
- _loggerProxy.default.logger.info("Locus-info:index#parseMessage --> ".concat(_this1.debugId, " unexpected (not visible) dataSet ").concat(dataSet.name, " received in hash tree message"));
1145
+ _loggerProxy.default.logger.info("Locus-info:index#parseMessage --> ".concat(_this0.debugId, " unexpected (not visible) dataSet ").concat(dataSet.name, " received in hash tree message"));
1175
1146
  }
1176
1147
  }
1177
- _this1.runSyncAlgorithm(dataSet);
1148
+ _this0.runSyncAlgorithm(dataSet);
1178
1149
  });
1179
1150
  }
1180
1151
  if (dataSetsRequiringInitialization.length > 0) {
@@ -1232,7 +1203,7 @@ var HashTreeParser = /*#__PURE__*/function () {
1232
1203
  key: "callLocusInfoUpdateCallback",
1233
1204
  value: function callLocusInfoUpdateCallback(updates) {
1234
1205
  var _updates$updatedObjec,
1235
- _this10 = this;
1206
+ _this1 = this;
1236
1207
  if (this.state === 'stopped') {
1237
1208
  return;
1238
1209
  }
@@ -1247,9 +1218,9 @@ var HashTreeParser = /*#__PURE__*/function () {
1247
1218
  version = elementId.version;
1248
1219
 
1249
1220
  // Check all datasets
1250
- for (var _i2 = 0, _Object$keys3 = (0, _keys.default)(_this10.dataSets); _i2 < _Object$keys3.length; _i2++) {
1221
+ for (var _i2 = 0, _Object$keys3 = (0, _keys.default)(_this1.dataSets); _i2 < _Object$keys3.length; _i2++) {
1251
1222
  var dataSetName = _Object$keys3[_i2];
1252
- var dataSet = _this10.dataSets[dataSetName];
1223
+ var dataSet = _this1.dataSets[dataSetName];
1253
1224
 
1254
1225
  // only visible datasets have hash trees set
1255
1226
  if (dataSet !== null && dataSet !== void 0 && dataSet.hashTree) {
@@ -1258,12 +1229,12 @@ var HashTreeParser = /*#__PURE__*/function () {
1258
1229
  if (object.data) {
1259
1230
  // For updates: filter out if any dataset has a higher version
1260
1231
  if (existingVersion > version) {
1261
- _loggerProxy.default.logger.info("HashTreeParser#callLocusInfoUpdateCallback --> ".concat(_this10.debugId, " Filtering out update for ").concat(type, ":").concat(id, " v").concat(version, " because dataset \"").concat(dataSetName, "\" has v").concat(existingVersion));
1232
+ _loggerProxy.default.logger.info("HashTreeParser#callLocusInfoUpdateCallback --> ".concat(_this1.debugId, " Filtering out update for ").concat(type, ":").concat(id, " v").concat(version, " because dataset \"").concat(dataSetName, "\" has v").concat(existingVersion));
1262
1233
  return false;
1263
1234
  }
1264
1235
  } else if (existingVersion >= version) {
1265
1236
  // For removals: filter out if the object still exists in any dataset
1266
- _loggerProxy.default.logger.info("HashTreeParser#callLocusInfoUpdateCallback --> ".concat(_this10.debugId, " Filtering out removal for ").concat(type, ":").concat(id, " v").concat(version, " because dataset \"").concat(dataSetName, "\" still has v").concat(existingVersion));
1237
+ _loggerProxy.default.logger.info("HashTreeParser#callLocusInfoUpdateCallback --> ".concat(_this1.debugId, " Filtering out removal for ").concat(type, ":").concat(id, " v").concat(version, " because dataset \"").concat(dataSetName, "\" still has v").concat(existingVersion));
1267
1238
  return false;
1268
1239
  }
1269
1240
  }
@@ -1303,84 +1274,104 @@ var HashTreeParser = /*#__PURE__*/function () {
1303
1274
  * Performs a sync for the given data set.
1304
1275
  *
1305
1276
  * @param {InternalDataSet} dataSet - The data set to sync
1306
- * @param {string} rootHash - Our current root hash for this data set
1307
1277
  * @param {string} reason - The reason for the sync (used for logging)
1278
+ * @param {boolean} [isInitialization] - Whether this is an initialization sync (sends empty leaves data instead of comparing hashes)
1308
1279
  * @returns {Promise<void>}
1309
1280
  */
1310
1281
  }, {
1311
1282
  key: "performSync",
1312
1283
  value: (function () {
1313
- var _performSync = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee5(dataSet, rootHash, reason) {
1314
- var mismatchedLeavesData, receivedHashes, _yield$this$getHashes, hashes, latestDataSetInfo, mismatchedLeaveIndexes, syncResponse, _t3, _t4;
1315
- return _regenerator.default.wrap(function (_context6) {
1316
- while (1) switch (_context6.prev = _context6.next) {
1284
+ var _performSync = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee6(dataSet, reason, isInitialization) {
1285
+ var hashTree, rootHash, leavesData, i, receivedHashes, hashesResult, mismatchedLeaveIndexes, syncResponse, _t3, _t4;
1286
+ return _regenerator.default.wrap(function (_context7) {
1287
+ while (1) switch (_context7.prev = _context7.next) {
1317
1288
  case 0:
1318
1289
  if (dataSet.hashTree) {
1319
- _context6.next = 1;
1290
+ _context7.next = 1;
1320
1291
  break;
1321
1292
  }
1322
- return _context6.abrupt("return");
1293
+ return _context7.abrupt("return");
1323
1294
  case 1:
1324
- _context6.prev = 1;
1295
+ hashTree = dataSet.hashTree;
1296
+ rootHash = hashTree.getRootHash();
1297
+ _context7.prev = 2;
1325
1298
  _loggerProxy.default.logger.info("HashTreeParser#performSync --> ".concat(this.debugId, " ").concat(reason, ", syncing data set \"").concat(dataSet.name, "\""));
1326
- mismatchedLeavesData = {};
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
+ leavesData = {};
1305
+ for (i = 0; i < dataSet.leafCount; i += 1) {
1306
+ leavesData[i] = [];
1307
+ }
1308
+ _context7.next = 11;
1309
+ break;
1310
+ case 3:
1327
1311
  if (!(dataSet.leafCount !== 1)) {
1328
- _context6.next = 7;
1312
+ _context7.next = 10;
1329
1313
  break;
1330
1314
  }
1331
- _context6.prev = 2;
1332
- _context6.next = 3;
1315
+ leavesData = {};
1316
+ _context7.prev = 4;
1317
+ _context7.next = 5;
1333
1318
  return this.getHashesFromLocus(dataSet.name, rootHash);
1334
- case 3:
1335
- _yield$this$getHashes = _context6.sent;
1336
- hashes = _yield$this$getHashes.hashes;
1337
- latestDataSetInfo = _yield$this$getHashes.dataSet;
1338
- receivedHashes = hashes;
1339
- dataSet.hashTree.resize(latestDataSetInfo.leafCount);
1340
- _context6.next = 6;
1319
+ case 5:
1320
+ hashesResult = _context7.sent;
1321
+ if (hashesResult) {
1322
+ _context7.next = 6;
1323
+ break;
1324
+ }
1325
+ return _context7.abrupt("return");
1326
+ case 6:
1327
+ receivedHashes = hashesResult.hashes;
1328
+ hashTree.resize(hashesResult.dataSet.leafCount);
1329
+ _context7.next = 9;
1341
1330
  break;
1342
- case 4:
1343
- _context6.prev = 4;
1344
- _t3 = _context6["catch"](2);
1345
- if (!(_t3.statusCode === 409)) {
1346
- _context6.next = 5;
1331
+ case 7:
1332
+ _context7.prev = 7;
1333
+ _t3 = _context7["catch"](4);
1334
+ if (!((_t3 === null || _t3 === void 0 ? void 0 : _t3.statusCode) === 409)) {
1335
+ _context7.next = 8;
1347
1336
  break;
1348
1337
  }
1349
1338
  // this is a leaf count mismatch, we should do nothing, just wait for another heartbeat message from Locus
1350
1339
  _loggerProxy.default.logger.info("HashTreeParser#getHashesFromLocus --> ".concat(this.debugId, " Got 409 when fetching hashes for data set \"").concat(dataSet.name, "\": ").concat(_t3.message));
1351
- return _context6.abrupt("return");
1352
- case 5:
1340
+ return _context7.abrupt("return");
1341
+ case 8:
1353
1342
  throw _t3;
1354
- case 6:
1343
+ case 9:
1355
1344
  // identify mismatched leaves
1356
- mismatchedLeaveIndexes = dataSet.hashTree.diffHashes(receivedHashes);
1345
+ mismatchedLeaveIndexes = hashTree.diffHashes(receivedHashes);
1357
1346
  mismatchedLeaveIndexes.forEach(function (index) {
1358
- mismatchedLeavesData[index] = dataSet.hashTree.getLeafData(index);
1347
+ leavesData[index] = hashTree.getLeafData(index);
1359
1348
  });
1360
- _context6.next = 8;
1349
+ _context7.next = 11;
1361
1350
  break;
1362
- case 7:
1363
- mismatchedLeavesData[0] = dataSet.hashTree.getLeafData(0);
1364
- case 8:
1365
- if (!((0, _keys.default)(mismatchedLeavesData).length > 0)) {
1366
- _context6.next = 10;
1351
+ case 10:
1352
+ leavesData = {
1353
+ 0: hashTree.getLeafData(0)
1354
+ };
1355
+ case 11:
1356
+ if (!((0, _keys.default)(leavesData).length > 0)) {
1357
+ _context7.next = 13;
1367
1358
  break;
1368
1359
  }
1369
- _context6.next = 9;
1370
- return this.sendSyncRequestToLocus(dataSet, mismatchedLeavesData);
1371
- case 9:
1372
- syncResponse = _context6.sent;
1360
+ _context7.next = 12;
1361
+ return this.sendSyncRequestToLocus(dataSet, leavesData);
1362
+ case 12:
1363
+ syncResponse = _context7.sent;
1373
1364
  // sync API may return nothing (in that case data will arrive via messages)
1374
1365
  // or it may return a response in the same format as messages
1375
1366
  if (syncResponse) {
1376
1367
  this.handleMessage(syncResponse, 'via sync API');
1377
1368
  }
1378
- case 10:
1379
- _context6.next = 12;
1369
+ case 13:
1370
+ _context7.next = 15;
1380
1371
  break;
1381
- case 11:
1382
- _context6.prev = 11;
1383
- _t4 = _context6["catch"](1);
1372
+ case 14:
1373
+ _context7.prev = 14;
1374
+ _t4 = _context7["catch"](2);
1384
1375
  if (_t4 instanceof MeetingEndedError) {
1385
1376
  this.callLocusInfoUpdateCallback({
1386
1377
  updateType: LocusInfoUpdateType.MEETING_ENDED
@@ -1388,17 +1379,176 @@ var HashTreeParser = /*#__PURE__*/function () {
1388
1379
  } else {
1389
1380
  _loggerProxy.default.logger.warn("HashTreeParser#performSync --> ".concat(this.debugId, " error during sync for data set \"").concat(dataSet.name, "\":"), _t4);
1390
1381
  }
1391
- case 12:
1382
+ case 15:
1392
1383
  case "end":
1393
- return _context6.stop();
1384
+ return _context7.stop();
1394
1385
  }
1395
- }, _callee5, this, [[1, 11], [2, 4]]);
1386
+ }, _callee6, this, [[2, 14], [4, 7]]);
1396
1387
  }));
1397
- function performSync(_x6, _x7, _x8) {
1388
+ function performSync(_x8, _x9, _x0) {
1398
1389
  return _performSync.apply(this, arguments);
1399
1390
  }
1400
1391
  return performSync;
1401
1392
  }()
1393
+ /**
1394
+ * Enqueues a sync for the given data set. If the data set is already in the queue, the request is ignored.
1395
+ * This ensures that all syncs are executed sequentially and no more than 1 sync runs at a time.
1396
+ *
1397
+ * @param {string} dataSetName - The name of the data set to sync
1398
+ * @param {string} reason - The reason for the sync (used for logging)
1399
+ * @param {boolean} [isInitialization=false] - Whether this is an initialization sync (uses empty leaves data instead of hash comparison)
1400
+ * @returns {void}
1401
+ */
1402
+ )
1403
+ }, {
1404
+ key: "enqueueSyncForDataset",
1405
+ value: function enqueueSyncForDataset(dataSetName, reason) {
1406
+ var isInitialization = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1407
+ if (this.state === 'stopped') return;
1408
+ var existingEntry = this.syncQueue.find(function (entry) {
1409
+ return entry.dataSetName === dataSetName;
1410
+ });
1411
+ if (existingEntry) {
1412
+ if (isInitialization) {
1413
+ existingEntry.isInitialization = true;
1414
+ }
1415
+ _loggerProxy.default.logger.info("HashTreeParser#enqueueSyncForDataset --> ".concat(this.debugId, " data set \"").concat(dataSetName, "\" already in sync queue, skipping"));
1416
+ return;
1417
+ }
1418
+ this.syncQueue.push({
1419
+ dataSetName: dataSetName,
1420
+ reason: reason,
1421
+ isInitialization: isInitialization
1422
+ });
1423
+ if (!this.isSyncInProgress) {
1424
+ this.syncQueueProcessingPromise = this.processSyncQueue();
1425
+ }
1426
+ }
1427
+
1428
+ /**
1429
+ * Processes the sync queue sequentially. Only one instance of this method runs at a time.
1430
+ *
1431
+ * @returns {Promise<void>}
1432
+ */
1433
+ }, {
1434
+ key: "processSyncQueue",
1435
+ value: (function () {
1436
+ var _processSyncQueue = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee7() {
1437
+ var _ref7, dataSetName, reason, isInitialization, dataSet;
1438
+ return _regenerator.default.wrap(function (_context8) {
1439
+ while (1) switch (_context8.prev = _context8.next) {
1440
+ case 0:
1441
+ if (!this.isSyncInProgress) {
1442
+ _context8.next = 1;
1443
+ break;
1444
+ }
1445
+ return _context8.abrupt("return");
1446
+ case 1:
1447
+ this.isSyncInProgress = true;
1448
+ _context8.prev = 2;
1449
+ case 3:
1450
+ if (!(this.syncQueue.length > 0 && this.state !== 'stopped')) {
1451
+ _context8.next = 6;
1452
+ break;
1453
+ }
1454
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1455
+ _ref7 = this.syncQueue.shift(), dataSetName = _ref7.dataSetName, reason = _ref7.reason, isInitialization = _ref7.isInitialization;
1456
+ dataSet = this.dataSets[dataSetName];
1457
+ if (dataSet !== null && dataSet !== void 0 && dataSet.hashTree) {
1458
+ _context8.next = 4;
1459
+ break;
1460
+ }
1461
+ return _context8.abrupt("continue", 3);
1462
+ case 4:
1463
+ _context8.next = 5;
1464
+ return this.performSync(dataSet, reason, isInitialization);
1465
+ case 5:
1466
+ _context8.next = 3;
1467
+ break;
1468
+ case 6:
1469
+ _context8.prev = 6;
1470
+ this.isSyncInProgress = false;
1471
+ return _context8.finish(6);
1472
+ case 7:
1473
+ case "end":
1474
+ return _context8.stop();
1475
+ }
1476
+ }, _callee7, this, [[2,, 6, 7]]);
1477
+ }));
1478
+ function processSyncQueue() {
1479
+ return _processSyncQueue.apply(this, arguments);
1480
+ }
1481
+ return processSyncQueue;
1482
+ }()
1483
+ /**
1484
+ * Syncs all data sets that have hash trees, one by one in sequence, using the priority order
1485
+ * provided by sortByInitPriority(). Does nothing if the parser is stopped or if a syncAllDatasets
1486
+ * call is already in progress.
1487
+ *
1488
+ * @returns {Promise<void>}
1489
+ */
1490
+ )
1491
+ }, {
1492
+ key: "syncAllDatasets",
1493
+ value: (function () {
1494
+ var _syncAllDatasets = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee8() {
1495
+ var dataSetsWithHashTrees, sorted, _iterator9, _step9, ds;
1496
+ return _regenerator.default.wrap(function (_context9) {
1497
+ while (1) switch (_context9.prev = _context9.next) {
1498
+ case 0:
1499
+ if (!(this.state === 'stopped')) {
1500
+ _context9.next = 1;
1501
+ break;
1502
+ }
1503
+ return _context9.abrupt("return");
1504
+ case 1:
1505
+ if (!this.isSyncAllInProgress) {
1506
+ _context9.next = 2;
1507
+ break;
1508
+ }
1509
+ return _context9.abrupt("return");
1510
+ case 2:
1511
+ this.isSyncAllInProgress = true;
1512
+ _context9.prev = 3;
1513
+ dataSetsWithHashTrees = (0, _values.default)(this.dataSets).filter(function (dataSet) {
1514
+ return dataSet === null || dataSet === void 0 ? void 0 : dataSet.hashTree;
1515
+ }).map(function (dataSet) {
1516
+ return {
1517
+ name: dataSet.name
1518
+ };
1519
+ });
1520
+ sorted = (0, _utils.sortByInitPriority)(dataSetsWithHashTrees, _constants2.DATA_SET_INIT_PRIORITY);
1521
+ _loggerProxy.default.logger.info("HashTreeParser#syncAllDatasets --> ".concat(this.debugId, " syncing datasets: ").concat(sorted.map(function (ds) {
1522
+ return ds.name;
1523
+ }).join(', ')));
1524
+ _iterator9 = _createForOfIteratorHelper(sorted);
1525
+ try {
1526
+ for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
1527
+ ds = _step9.value;
1528
+ this.enqueueSyncForDataset(ds.name, 'syncAllDatasets');
1529
+ }
1530
+ } catch (err) {
1531
+ _iterator9.e(err);
1532
+ } finally {
1533
+ _iterator9.f();
1534
+ }
1535
+ _context9.next = 4;
1536
+ return this.syncQueueProcessingPromise;
1537
+ case 4:
1538
+ _context9.prev = 4;
1539
+ this.isSyncAllInProgress = false;
1540
+ return _context9.finish(4);
1541
+ case 5:
1542
+ case "end":
1543
+ return _context9.stop();
1544
+ }
1545
+ }, _callee8, this, [[3,, 4, 5]]);
1546
+ }));
1547
+ function syncAllDatasets() {
1548
+ return _syncAllDatasets.apply(this, arguments);
1549
+ }
1550
+ return syncAllDatasets;
1551
+ }()
1402
1552
  /**
1403
1553
  * Runs the sync algorithm for the given data set.
1404
1554
  *
@@ -1409,7 +1559,7 @@ var HashTreeParser = /*#__PURE__*/function () {
1409
1559
  }, {
1410
1560
  key: "runSyncAlgorithm",
1411
1561
  value: function runSyncAlgorithm(receivedDataSet) {
1412
- var _this11 = this;
1562
+ var _this10 = this;
1413
1563
  var dataSet = this.dataSets[receivedDataSet.name];
1414
1564
  if (!dataSet) {
1415
1565
  _loggerProxy.default.logger.warn("HashTreeParser#runSyncAlgorithm --> ".concat(this.debugId, " No data set found for ").concat(receivedDataSet.name, ", skipping sync algorithm"));
@@ -1430,37 +1580,19 @@ var HashTreeParser = /*#__PURE__*/function () {
1430
1580
  clearTimeout(dataSet.timer);
1431
1581
  }
1432
1582
  _loggerProxy.default.logger.info("HashTreeParser#runSyncAlgorithm --> ".concat(this.debugId, " setting \"").concat(dataSet.name, "\" sync timer for ").concat(delay));
1433
- dataSet.timer = setTimeout(/*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee6() {
1434
- var rootHash;
1435
- return _regenerator.default.wrap(function (_context7) {
1436
- while (1) switch (_context7.prev = _context7.next) {
1437
- case 0:
1438
- dataSet.timer = undefined;
1439
- if (dataSet.hashTree) {
1440
- _context7.next = 1;
1441
- break;
1442
- }
1443
- _loggerProxy.default.logger.warn("HashTreeParser#runSyncAlgorithm --> ".concat(_this11.debugId, " Data set \"").concat(dataSet.name, "\" no longer has a hash tree, cannot run sync algorithm"));
1444
- return _context7.abrupt("return");
1445
- case 1:
1446
- rootHash = dataSet.hashTree.getRootHash();
1447
- if (!(dataSet.root !== rootHash)) {
1448
- _context7.next = 3;
1449
- break;
1450
- }
1451
- _context7.next = 2;
1452
- return _this11.performSync(dataSet, rootHash, "Root hash mismatch: received=".concat(dataSet.root, ", ours=").concat(rootHash));
1453
- case 2:
1454
- _context7.next = 4;
1455
- break;
1456
- case 3:
1457
- _loggerProxy.default.logger.info("HashTreeParser#runSyncAlgorithm --> ".concat(_this11.debugId, " \"").concat(dataSet.name, "\" root hash matching: ").concat(rootHash, ", version=").concat(dataSet.version));
1458
- case 4:
1459
- case "end":
1460
- return _context7.stop();
1461
- }
1462
- }, _callee6);
1463
- })), delay);
1583
+ dataSet.timer = setTimeout(function () {
1584
+ dataSet.timer = undefined;
1585
+ if (!dataSet.hashTree) {
1586
+ _loggerProxy.default.logger.warn("HashTreeParser#runSyncAlgorithm --> ".concat(_this10.debugId, " Data set \"").concat(dataSet.name, "\" no longer has a hash tree, cannot run sync algorithm"));
1587
+ return;
1588
+ }
1589
+ var rootHash = dataSet.hashTree.getRootHash();
1590
+ if (dataSet.root !== rootHash) {
1591
+ _this10.enqueueSyncForDataset(dataSet.name, "Root hash mismatch: received=".concat(dataSet.root, ", ours=").concat(rootHash));
1592
+ } else {
1593
+ _loggerProxy.default.logger.info("HashTreeParser#runSyncAlgorithm --> ".concat(_this10.debugId, " \"").concat(dataSet.name, "\" root hash matching: ").concat(rootHash, ", version=").concat(dataSet.version));
1594
+ }
1595
+ }, delay);
1464
1596
  } else {
1465
1597
  _loggerProxy.default.logger.info("HashTreeParser#runSyncAlgorithm --> ".concat(this.debugId, " No delay for \"").concat(dataSet.name, "\" data set, skipping sync timer reset/setup"));
1466
1598
  }
@@ -1478,16 +1610,16 @@ var HashTreeParser = /*#__PURE__*/function () {
1478
1610
  }, {
1479
1611
  key: "resetHeartbeatWatchdogs",
1480
1612
  value: function resetHeartbeatWatchdogs(receivedDataSets) {
1481
- var _this12 = this;
1613
+ var _this11 = this;
1482
1614
  if (!this.heartbeatIntervalMs) {
1483
1615
  return;
1484
1616
  }
1485
- var _iterator9 = _createForOfIteratorHelper(receivedDataSets),
1486
- _step9;
1617
+ var _iterator0 = _createForOfIteratorHelper(receivedDataSets),
1618
+ _step0;
1487
1619
  try {
1488
1620
  var _loop2 = function _loop2() {
1489
- var receivedDataSet = _step9.value;
1490
- var dataSet = _this12.dataSets[receivedDataSet.name];
1621
+ var receivedDataSet = _step0.value;
1622
+ var dataSet = _this11.dataSets[receivedDataSet.name];
1491
1623
  if (!(dataSet !== null && dataSet !== void 0 && dataSet.hashTree)) {
1492
1624
  // eslint-disable-next-line no-continue
1493
1625
  return 1; // continue
@@ -1496,30 +1628,21 @@ var HashTreeParser = /*#__PURE__*/function () {
1496
1628
  clearTimeout(dataSet.heartbeatWatchdogTimer);
1497
1629
  dataSet.heartbeatWatchdogTimer = undefined;
1498
1630
  }
1499
- var backoffTime = _this12.getWeightedBackoffTime(dataSet.backoff);
1500
- var delay = _this12.heartbeatIntervalMs + backoffTime;
1501
- dataSet.heartbeatWatchdogTimer = setTimeout(/*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee7() {
1502
- return _regenerator.default.wrap(function (_context8) {
1503
- while (1) switch (_context8.prev = _context8.next) {
1504
- case 0:
1505
- dataSet.heartbeatWatchdogTimer = undefined;
1506
- _loggerProxy.default.logger.warn("HashTreeParser#resetHeartbeatWatchdogs --> ".concat(_this12.debugId, " Heartbeat watchdog fired for data set \"").concat(dataSet.name, "\" - no heartbeat received within expected interval, initiating sync"));
1507
- _context8.next = 1;
1508
- return _this12.performSync(dataSet, dataSet.hashTree.getRootHash(), "heartbeat watchdog expired");
1509
- case 1:
1510
- case "end":
1511
- return _context8.stop();
1512
- }
1513
- }, _callee7);
1514
- })), delay);
1631
+ var backoffTime = _this11.getWeightedBackoffTime(dataSet.backoff);
1632
+ var delay = _this11.heartbeatIntervalMs + backoffTime;
1633
+ dataSet.heartbeatWatchdogTimer = setTimeout(function () {
1634
+ dataSet.heartbeatWatchdogTimer = undefined;
1635
+ _loggerProxy.default.logger.warn("HashTreeParser#resetHeartbeatWatchdogs --> ".concat(_this11.debugId, " Heartbeat watchdog fired for data set \"").concat(dataSet.name, "\" - no heartbeat received within expected interval, initiating sync"));
1636
+ _this11.enqueueSyncForDataset(dataSet.name, "heartbeat watchdog expired");
1637
+ }, delay);
1515
1638
  };
1516
- for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
1639
+ for (_iterator0.s(); !(_step0 = _iterator0.n()).done;) {
1517
1640
  if (_loop2()) continue;
1518
1641
  }
1519
1642
  } catch (err) {
1520
- _iterator9.e(err);
1643
+ _iterator0.e(err);
1521
1644
  } finally {
1522
- _iterator9.f();
1645
+ _iterator0.f();
1523
1646
  }
1524
1647
  }
1525
1648
 
@@ -1553,6 +1676,7 @@ var HashTreeParser = /*#__PURE__*/function () {
1553
1676
  value: function stop() {
1554
1677
  _loggerProxy.default.logger.info("HashTreeParser#stop --> ".concat(this.debugId, " Stopping HashTreeParser, clearing timers and hash trees"));
1555
1678
  this.stopAllTimers();
1679
+ this.syncQueue = [];
1556
1680
  (0, _values.default)(this.dataSets).forEach(function (dataSet) {
1557
1681
  dataSet.hashTree = undefined;
1558
1682
  });
@@ -1573,29 +1697,29 @@ var HashTreeParser = /*#__PURE__*/function () {
1573
1697
  }
1574
1698
 
1575
1699
  /**
1576
- * Resumes the HashTreeParser that was previously stopped.
1700
+ * Resumes the HashTreeParser that was previously stopped, using a hash tree message.
1577
1701
  * @param {HashTreeMessage} message - The message to resume with, it must contain metadata with visible data sets info
1578
1702
  * @returns {void}
1579
1703
  */
1580
1704
  }, {
1581
- key: "resume",
1582
- value: function resume(message) {
1705
+ key: "resumeFromMessage",
1706
+ value: function resumeFromMessage(message) {
1583
1707
  var _message$locusStateEl2, _metadataObject$data;
1584
1708
  // check that message contains metadata with visible data sets - this is essential to be able to resume
1585
1709
  var metadataObject = (_message$locusStateEl2 = message.locusStateElements) === null || _message$locusStateEl2 === void 0 ? void 0 : _message$locusStateEl2.find(function (el) {
1586
1710
  return (0, _utils.isMetadata)(el);
1587
1711
  });
1588
1712
  if (!(metadataObject !== null && metadataObject !== void 0 && (_metadataObject$data = metadataObject.data) !== null && _metadataObject$data !== void 0 && _metadataObject$data.visibleDataSets)) {
1589
- _loggerProxy.default.logger.warn("HashTreeParser#resume --> ".concat(this.debugId, " Cannot resume HashTreeParser because the message is missing metadata with visible data sets info"));
1713
+ _loggerProxy.default.logger.warn("HashTreeParser#resumeFromMessage --> ".concat(this.debugId, " Cannot resume HashTreeParser because the message is missing metadata with visible data sets info"));
1590
1714
  return;
1591
1715
  }
1592
1716
  this.setVisibleDataSets(metadataObject.data.visibleDataSets, message.dataSets);
1593
1717
  this.dataSets = {};
1594
- var _iterator0 = _createForOfIteratorHelper(message.dataSets),
1595
- _step0;
1718
+ var _iterator1 = _createForOfIteratorHelper(message.dataSets),
1719
+ _step1;
1596
1720
  try {
1597
- for (_iterator0.s(); !(_step0 = _iterator0.n()).done;) {
1598
- var dataSet = _step0.value;
1721
+ for (_iterator1.s(); !(_step1 = _iterator1.n()).done;) {
1722
+ var dataSet = _step1.value;
1599
1723
  var name = dataSet.name,
1600
1724
  leafCount = dataSet.leafCount;
1601
1725
  this.dataSets[name] = _objectSpread(_objectSpread({}, dataSet), {}, {
@@ -1603,16 +1727,47 @@ var HashTreeParser = /*#__PURE__*/function () {
1603
1727
  });
1604
1728
  }
1605
1729
  } catch (err) {
1606
- _iterator0.e(err);
1730
+ _iterator1.e(err);
1607
1731
  } finally {
1608
- _iterator0.f();
1732
+ _iterator1.f();
1609
1733
  }
1610
- _loggerProxy.default.logger.info("HashTreeParser#resume --> ".concat(this.debugId, " Resuming HashTreeParser with data sets: ").concat((0, _keys.default)(this.dataSets).join(', '), ", visible data sets: ").concat(this.visibleDataSets.map(function (ds) {
1734
+ _loggerProxy.default.logger.info("HashTreeParser#resumeFromMessage --> ".concat(this.debugId, " Resuming HashTreeParser with data sets: ").concat((0, _keys.default)(this.dataSets).join(', '), ", visible data sets: ").concat(this.visibleDataSets.map(function (ds) {
1611
1735
  return ds.name;
1612
1736
  }).join(', ')));
1613
1737
  this.state = 'active';
1614
1738
  this.handleMessage(message, 'on resume');
1615
1739
  }
1740
+
1741
+ /**
1742
+ * Resumes the HashTreeParser that was previously stopped, using a Locus API response.
1743
+ * Unlike resumeFromMessage(), this does not require metadata/dataSets in the input,
1744
+ * as it fetches all necessary information from Locus via initializeFromGetLociResponse.
1745
+ * @param {LocusDTO} locus - locus object from an API response
1746
+ * @returns {Promise}
1747
+ */
1748
+ }, {
1749
+ key: "resumeFromApiResponse",
1750
+ value: (function () {
1751
+ var _resumeFromApiResponse = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee9(locus) {
1752
+ return _regenerator.default.wrap(function (_context0) {
1753
+ while (1) switch (_context0.prev = _context0.next) {
1754
+ case 0:
1755
+ this.state = 'active';
1756
+ this.dataSets = {};
1757
+ _loggerProxy.default.logger.info("HashTreeParser#resumeFromApiResponse --> ".concat(this.debugId, " Resuming HashTreeParser from API response"));
1758
+ _context0.next = 1;
1759
+ return this.initializeFromGetLociResponse(locus);
1760
+ case 1:
1761
+ case "end":
1762
+ return _context0.stop();
1763
+ }
1764
+ }, _callee9, this);
1765
+ }));
1766
+ function resumeFromApiResponse(_x1) {
1767
+ return _resumeFromApiResponse.apply(this, arguments);
1768
+ }
1769
+ return resumeFromApiResponse;
1770
+ }())
1616
1771
  }, {
1617
1772
  key: "checkForSentinelHttpResponse",
1618
1773
  value: function checkForSentinelHttpResponse(error, dataSetName) {
@@ -1629,12 +1784,12 @@ var HashTreeParser = /*#__PURE__*/function () {
1629
1784
  * Gets the current hashes from the locus for a specific data set.
1630
1785
  * @param {string} dataSetName
1631
1786
  * @param {string} currentRootHash
1632
- * @returns {string[]}
1787
+ * @returns {Object|null} An object containing the hashes and leaf count, or null if the hashes match and no sync is needed
1633
1788
  */
1634
1789
  }, {
1635
1790
  key: "getHashesFromLocus",
1636
1791
  value: function getHashesFromLocus(dataSetName, currentRootHash) {
1637
- var _this13 = this;
1792
+ var _this12 = this;
1638
1793
  _loggerProxy.default.logger.info("HashTreeParser#getHashesFromLocus --> ".concat(this.debugId, " Requesting hashes for data set \"").concat(dataSetName, "\""));
1639
1794
  var dataSet = this.dataSets[dataSetName];
1640
1795
  var url = "".concat(dataSet.url, "/hashtree");
@@ -1646,20 +1801,25 @@ var HashTreeParser = /*#__PURE__*/function () {
1646
1801
  }
1647
1802
  }).then(function (response) {
1648
1803
  var _response$body, _response$body2;
1804
+ if (!response.body || (0, _lodash.isEmpty)(response.body)) {
1805
+ // 204 with empty body means our hashes match Locus, no sync needed
1806
+ _loggerProxy.default.logger.info("HashTreeParser#getHashesFromLocus --> ".concat(_this12.debugId, " Got ").concat(response.statusCode, " with empty body for data set \"").concat(dataSetName, "\", hashes match - no sync needed"));
1807
+ return null;
1808
+ }
1649
1809
  var hashes = (_response$body = response.body) === null || _response$body === void 0 ? void 0 : _response$body.hashes;
1650
1810
  var dataSetFromResponse = (_response$body2 = response.body) === null || _response$body2 === void 0 ? void 0 : _response$body2.dataSet;
1651
1811
  if (!hashes || !(0, _isArray.default)(hashes)) {
1652
- _loggerProxy.default.logger.warn("HashTreeParser#getHashesFromLocus --> ".concat(_this13.debugId, " Locus returned invalid hashes, response body="), response.body);
1812
+ _loggerProxy.default.logger.warn("HashTreeParser#getHashesFromLocus --> ".concat(_this12.debugId, " Locus returned invalid hashes, response body="), response.body);
1653
1813
  throw new Error("Locus returned invalid hashes: ".concat(hashes));
1654
1814
  }
1655
- _loggerProxy.default.logger.info("HashTreeParser#getHashesFromLocus --> ".concat(_this13.debugId, " Received hashes for data set \"").concat(dataSetName, "\": ").concat((0, _stringify.default)(hashes)));
1815
+ _loggerProxy.default.logger.info("HashTreeParser#getHashesFromLocus --> ".concat(_this12.debugId, " Received hashes for data set \"").concat(dataSetName, "\": ").concat((0, _stringify.default)(hashes)));
1656
1816
  return {
1657
1817
  hashes: hashes,
1658
1818
  dataSet: dataSetFromResponse
1659
1819
  };
1660
1820
  }).catch(function (error) {
1661
- _loggerProxy.default.logger.error("HashTreeParser#getHashesFromLocus --> ".concat(_this13.debugId, " Error ").concat(error.statusCode, " fetching hashes for data set \"").concat(dataSetName, "\":"), error);
1662
- _this13.checkForSentinelHttpResponse(error, dataSet.name);
1821
+ _loggerProxy.default.logger.error("HashTreeParser#getHashesFromLocus --> ".concat(_this12.debugId, " Error ").concat(error.statusCode, " fetching hashes for data set \"").concat(dataSetName, "\":"), error);
1822
+ _this12.checkForSentinelHttpResponse(error, dataSet.name);
1663
1823
  throw error;
1664
1824
  });
1665
1825
  }
@@ -1674,7 +1834,7 @@ var HashTreeParser = /*#__PURE__*/function () {
1674
1834
  }, {
1675
1835
  key: "sendSyncRequestToLocus",
1676
1836
  value: function sendSyncRequestToLocus(dataSet, mismatchedLeavesData) {
1677
- var _this14 = this;
1837
+ var _this13 = this;
1678
1838
  _loggerProxy.default.logger.info("HashTreeParser#sendSyncRequestToLocus --> ".concat(this.debugId, " Sending sync request for data set \"").concat(dataSet.name, "\""));
1679
1839
  var url = "".concat(dataSet.url, "/sync");
1680
1840
  var body = {
@@ -1697,15 +1857,15 @@ var HashTreeParser = /*#__PURE__*/function () {
1697
1857
  },
1698
1858
  body: body
1699
1859
  }).then(function (resp) {
1700
- _loggerProxy.default.logger.info("HashTreeParser#sendSyncRequestToLocus --> ".concat(_this14.debugId, " Sync request succeeded for \"").concat(dataSet.name, "\""));
1860
+ _loggerProxy.default.logger.info("HashTreeParser#sendSyncRequestToLocus --> ".concat(_this13.debugId, " Sync request succeeded for \"").concat(dataSet.name, "\""));
1701
1861
  if (!resp.body || (0, _lodash.isEmpty)(resp.body)) {
1702
- _loggerProxy.default.logger.info("HashTreeParser#sendSyncRequestToLocus --> ".concat(_this14.debugId, " Got ").concat(resp.statusCode, " with empty body for sync request for data set \"").concat(dataSet.name, "\", data should arrive via messages"));
1862
+ _loggerProxy.default.logger.info("HashTreeParser#sendSyncRequestToLocus --> ".concat(_this13.debugId, " Got ").concat(resp.statusCode, " with empty body for sync request for data set \"").concat(dataSet.name, "\", data should arrive via messages"));
1703
1863
  return null;
1704
1864
  }
1705
1865
  return resp.body;
1706
1866
  }).catch(function (error) {
1707
- _loggerProxy.default.logger.error("HashTreeParser#sendSyncRequestToLocus --> ".concat(_this14.debugId, " Error ").concat(error.statusCode, " sending sync request for data set \"").concat(dataSet.name, "\":"), error);
1708
- _this14.checkForSentinelHttpResponse(error, dataSet.name);
1867
+ _loggerProxy.default.logger.error("HashTreeParser#sendSyncRequestToLocus --> ".concat(_this13.debugId, " Error ").concat(error.statusCode, " sending sync request for data set \"").concat(dataSet.name, "\":"), error);
1868
+ _this13.checkForSentinelHttpResponse(error, dataSet.name);
1709
1869
  throw error;
1710
1870
  });
1711
1871
  }