@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.
- 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 +480 -320
- package/dist/hashTree/hashTreeParser.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/index.js +170 -36
- package/dist/locus-info/index.js.map +1 -1
- package/dist/meetings/index.js +130 -45
- package/dist/meetings/index.js.map +1 -1
- package/dist/types/hashTree/hashTreeParser.d.ts +40 -12
- package/dist/types/locus-info/index.d.ts +29 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +14 -14
- package/src/hashTree/hashTreeParser.ts +182 -97
- package/src/locus-info/index.ts +176 -48
- package/src/meetings/index.ts +42 -17
- package/test/unit/spec/hashTree/hashTreeParser.ts +372 -7
- package/test/unit/spec/locus-info/index.js +179 -4
- package/test/unit/spec/meetings/index.js +127 -5
|
@@ -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
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
return
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
-
|
|
257
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
291
|
+
var _initializeFromMessage = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2(message) {
|
|
306
292
|
var visibleDataSets;
|
|
307
|
-
return _regenerator.default.wrap(function (
|
|
308
|
-
while (1) switch (
|
|
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
|
-
|
|
298
|
+
_context2.next = 1;
|
|
313
299
|
return this.getAllVisibleDataSetsFromLocus();
|
|
314
300
|
case 1:
|
|
315
|
-
visibleDataSets =
|
|
316
|
-
|
|
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
|
|
306
|
+
return _context2.stop();
|
|
321
307
|
}
|
|
322
|
-
},
|
|
308
|
+
}, _callee2, this);
|
|
323
309
|
}));
|
|
324
|
-
function initializeFromMessage(
|
|
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
|
|
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 (
|
|
346
|
-
while (1) switch (
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
343
|
+
_context3.next = 2;
|
|
358
344
|
return this.getAllVisibleDataSetsFromLocus();
|
|
359
345
|
case 2:
|
|
360
|
-
visibleDataSets =
|
|
361
|
-
|
|
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
|
|
351
|
+
return _context3.stop();
|
|
366
352
|
}
|
|
367
|
-
},
|
|
353
|
+
}, _callee3, this);
|
|
368
354
|
}));
|
|
369
|
-
function initializeFromGetLociResponse(
|
|
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
|
|
386
|
-
var
|
|
387
|
-
return _regenerator.default.wrap(function (
|
|
388
|
-
while (1) switch (
|
|
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
|
-
|
|
377
|
+
_context4.next = 1;
|
|
392
378
|
break;
|
|
393
379
|
}
|
|
394
|
-
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
|
-
|
|
383
|
+
_context4.prev = 2;
|
|
399
384
|
_iterator2.s();
|
|
400
385
|
case 3:
|
|
401
386
|
if ((_step2 = _iterator2.n()).done) {
|
|
402
|
-
|
|
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
|
-
|
|
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
|
-
|
|
406
|
+
_context4.next = 4;
|
|
422
407
|
break;
|
|
423
408
|
}
|
|
424
|
-
return
|
|
409
|
+
return _context4.abrupt("continue", 5);
|
|
425
410
|
case 4:
|
|
426
|
-
if (this.dataSets[name].hashTree) {
|
|
427
|
-
|
|
428
|
-
|
|
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
|
-
|
|
438
|
-
|
|
439
|
-
updatedObjects.push.apply(updatedObjects, (0, _toConsumableArray2.default)(data.updatedObjects || []));
|
|
440
|
-
}
|
|
417
|
+
_context4.next = 3;
|
|
418
|
+
break;
|
|
441
419
|
case 6:
|
|
442
|
-
|
|
420
|
+
_context4.next = 8;
|
|
443
421
|
break;
|
|
444
422
|
case 7:
|
|
445
|
-
|
|
446
|
-
|
|
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
|
|
452
|
-
|
|
426
|
+
case 8:
|
|
427
|
+
_context4.prev = 8;
|
|
453
428
|
_iterator2.f();
|
|
454
|
-
return
|
|
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
|
|
435
|
+
return _context4.stop();
|
|
463
436
|
}
|
|
464
|
-
},
|
|
437
|
+
}, _callee4, this, [[2, 7, 8, 9]]);
|
|
465
438
|
}));
|
|
466
|
-
function initializeDataSets(
|
|
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
|
|
575
|
+
var _this3 = this;
|
|
603
576
|
return message.dataSets.some(function (dataSet) {
|
|
604
|
-
if (dataSet.leafCount === 1 && dataSet.root === _constants2.EMPTY_HASH && (!
|
|
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
|
|
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
|
-
|
|
637
|
-
|
|
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
|
|
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
|
-
|
|
628
|
+
_this5.initializeNewVisibleDataSets(dataSetsRequiringInitialization).catch(function (error) {
|
|
656
629
|
if (error instanceof MeetingEndedError) {
|
|
657
|
-
|
|
630
|
+
_this5.callLocusInfoUpdateCallback({
|
|
658
631
|
updateType: LocusInfoUpdateType.MEETING_ENDED
|
|
659
632
|
});
|
|
660
633
|
} else {
|
|
661
|
-
_loggerProxy.default.logger.warn("HashTreeParser#queueInitForNewVisibleDataSets --> ".concat(
|
|
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
|
|
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 (
|
|
759
|
-
if (
|
|
760
|
-
var appliedChangesList =
|
|
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(
|
|
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(
|
|
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
|
|
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 !
|
|
821
|
+
return !_this7.isExcludedDataSet(vds.name);
|
|
848
822
|
});
|
|
849
|
-
removedDataSets =
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
921
|
-
if ((
|
|
922
|
-
for (var i = 0; i <
|
|
923
|
-
removedObjects.push.apply(removedObjects, (0, _toConsumableArray2.default)(
|
|
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
|
-
|
|
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
|
|
995
|
-
var
|
|
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 (
|
|
998
|
-
while (1) switch (
|
|
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
|
-
|
|
975
|
+
_context6.next = 1;
|
|
1002
976
|
break;
|
|
1003
977
|
}
|
|
1004
|
-
return
|
|
978
|
+
return _context6.abrupt("return");
|
|
1005
979
|
case 1:
|
|
1006
|
-
|
|
980
|
+
_context6.next = 2;
|
|
1007
981
|
return this.getAllVisibleDataSetsFromLocus();
|
|
1008
982
|
case 2:
|
|
1009
|
-
allDataSets =
|
|
983
|
+
allDataSets = _context6.sent;
|
|
1010
984
|
_iterator7 = _createForOfIteratorHelper((0, _utils.sortByInitPriority)(addedDataSets, _constants2.DATA_SET_INIT_PRIORITY));
|
|
1011
|
-
|
|
985
|
+
_context6.prev = 3;
|
|
1012
986
|
_loop = /*#__PURE__*/_regenerator.default.mark(function _loop() {
|
|
1013
|
-
var ds, dataSetInfo
|
|
1014
|
-
return _regenerator.default.wrap(function (
|
|
1015
|
-
while (1) switch (
|
|
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(
|
|
995
|
+
_loggerProxy.default.logger.info("HashTreeParser#initializeNewVisibleDataSets --> ".concat(_this9.debugId, " initializing data set \"").concat(ds.name, "\""));
|
|
1022
996
|
if (dataSetInfo) {
|
|
1023
|
-
|
|
997
|
+
_context5.next = 1;
|
|
1024
998
|
break;
|
|
1025
999
|
}
|
|
1026
|
-
_loggerProxy.default.logger.warn("HashTreeParser#initializeNewVisibleDataSets --> ".concat(
|
|
1027
|
-
|
|
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
|
-
|
|
1031
|
-
return
|
|
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
|
|
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
|
-
|
|
1015
|
+
_context6.next = 6;
|
|
1045
1016
|
break;
|
|
1046
1017
|
}
|
|
1047
|
-
return
|
|
1018
|
+
return _context6.delegateYield(_loop(), "t0", 5);
|
|
1048
1019
|
case 5:
|
|
1049
|
-
|
|
1020
|
+
_context6.next = 4;
|
|
1050
1021
|
break;
|
|
1051
1022
|
case 6:
|
|
1052
|
-
|
|
1023
|
+
_context6.next = 8;
|
|
1053
1024
|
break;
|
|
1054
1025
|
case 7:
|
|
1055
|
-
|
|
1056
|
-
_t2 =
|
|
1026
|
+
_context6.prev = 7;
|
|
1027
|
+
_t2 = _context6["catch"](3);
|
|
1057
1028
|
_iterator7.e(_t2);
|
|
1058
1029
|
case 8:
|
|
1059
|
-
|
|
1030
|
+
_context6.prev = 8;
|
|
1060
1031
|
_iterator7.f();
|
|
1061
|
-
return
|
|
1032
|
+
return _context6.finish(8);
|
|
1062
1033
|
case 9:
|
|
1063
1034
|
case "end":
|
|
1064
|
-
return
|
|
1035
|
+
return _context6.stop();
|
|
1065
1036
|
}
|
|
1066
|
-
},
|
|
1037
|
+
}, _callee5, this, [[3, 7, 8, 9]]);
|
|
1067
1038
|
}));
|
|
1068
|
-
function initializeNewVisibleDataSets(
|
|
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
|
-
|
|
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
|
|
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
|
|
1091
|
+
var _this0$dataSets$dataS;
|
|
1121
1092
|
var dataSetName = _step8.value;
|
|
1122
|
-
var 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 (
|
|
1150
|
-
var 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(
|
|
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
|
-
|
|
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
|
-
|
|
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)(
|
|
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 =
|
|
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(
|
|
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(
|
|
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
|
|
1314
|
-
var
|
|
1315
|
-
return _regenerator.default.wrap(function (
|
|
1316
|
-
while (1) switch (
|
|
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
|
-
|
|
1290
|
+
_context7.next = 1;
|
|
1320
1291
|
break;
|
|
1321
1292
|
}
|
|
1322
|
-
return
|
|
1293
|
+
return _context7.abrupt("return");
|
|
1323
1294
|
case 1:
|
|
1324
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1312
|
+
_context7.next = 10;
|
|
1329
1313
|
break;
|
|
1330
1314
|
}
|
|
1331
|
-
|
|
1332
|
-
|
|
1315
|
+
leavesData = {};
|
|
1316
|
+
_context7.prev = 4;
|
|
1317
|
+
_context7.next = 5;
|
|
1333
1318
|
return this.getHashesFromLocus(dataSet.name, rootHash);
|
|
1334
|
-
case
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
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
|
|
1343
|
-
|
|
1344
|
-
_t3 =
|
|
1345
|
-
if (!(_t3.statusCode === 409)) {
|
|
1346
|
-
|
|
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
|
|
1352
|
-
case
|
|
1340
|
+
return _context7.abrupt("return");
|
|
1341
|
+
case 8:
|
|
1353
1342
|
throw _t3;
|
|
1354
|
-
case
|
|
1343
|
+
case 9:
|
|
1355
1344
|
// identify mismatched leaves
|
|
1356
|
-
mismatchedLeaveIndexes =
|
|
1345
|
+
mismatchedLeaveIndexes = hashTree.diffHashes(receivedHashes);
|
|
1357
1346
|
mismatchedLeaveIndexes.forEach(function (index) {
|
|
1358
|
-
|
|
1347
|
+
leavesData[index] = hashTree.getLeafData(index);
|
|
1359
1348
|
});
|
|
1360
|
-
|
|
1349
|
+
_context7.next = 11;
|
|
1361
1350
|
break;
|
|
1362
|
-
case
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
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
|
-
|
|
1370
|
-
return this.sendSyncRequestToLocus(dataSet,
|
|
1371
|
-
case
|
|
1372
|
-
syncResponse =
|
|
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
|
|
1379
|
-
|
|
1369
|
+
case 13:
|
|
1370
|
+
_context7.next = 15;
|
|
1380
1371
|
break;
|
|
1381
|
-
case
|
|
1382
|
-
|
|
1383
|
-
_t4 =
|
|
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
|
|
1382
|
+
case 15:
|
|
1392
1383
|
case "end":
|
|
1393
|
-
return
|
|
1384
|
+
return _context7.stop();
|
|
1394
1385
|
}
|
|
1395
|
-
},
|
|
1386
|
+
}, _callee6, this, [[2, 14], [4, 7]]);
|
|
1396
1387
|
}));
|
|
1397
|
-
function performSync(
|
|
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
|
|
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(
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
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
|
|
1613
|
+
var _this11 = this;
|
|
1482
1614
|
if (!this.heartbeatIntervalMs) {
|
|
1483
1615
|
return;
|
|
1484
1616
|
}
|
|
1485
|
-
var
|
|
1486
|
-
|
|
1617
|
+
var _iterator0 = _createForOfIteratorHelper(receivedDataSets),
|
|
1618
|
+
_step0;
|
|
1487
1619
|
try {
|
|
1488
1620
|
var _loop2 = function _loop2() {
|
|
1489
|
-
var receivedDataSet =
|
|
1490
|
-
var dataSet =
|
|
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 =
|
|
1500
|
-
var delay =
|
|
1501
|
-
dataSet.heartbeatWatchdogTimer = setTimeout(
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
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 (
|
|
1639
|
+
for (_iterator0.s(); !(_step0 = _iterator0.n()).done;) {
|
|
1517
1640
|
if (_loop2()) continue;
|
|
1518
1641
|
}
|
|
1519
1642
|
} catch (err) {
|
|
1520
|
-
|
|
1643
|
+
_iterator0.e(err);
|
|
1521
1644
|
} finally {
|
|
1522
|
-
|
|
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: "
|
|
1582
|
-
value: function
|
|
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#
|
|
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
|
|
1595
|
-
|
|
1718
|
+
var _iterator1 = _createForOfIteratorHelper(message.dataSets),
|
|
1719
|
+
_step1;
|
|
1596
1720
|
try {
|
|
1597
|
-
for (
|
|
1598
|
-
var dataSet =
|
|
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
|
-
|
|
1730
|
+
_iterator1.e(err);
|
|
1607
1731
|
} finally {
|
|
1608
|
-
|
|
1732
|
+
_iterator1.f();
|
|
1609
1733
|
}
|
|
1610
|
-
_loggerProxy.default.logger.info("HashTreeParser#
|
|
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 {
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
1662
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
1708
|
-
|
|
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
|
}
|