@webex/plugin-meetings 3.11.0-next.13 → 3.11.0-next.14
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/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/hashTree/hashTree.js +18 -0
- package/dist/hashTree/hashTree.js.map +1 -1
- package/dist/hashTree/hashTreeParser.js +63 -23
- package/dist/hashTree/hashTreeParser.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/types/hashTree/hashTree.d.ts +7 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +1 -1
- package/src/hashTree/hashTree.ts +17 -0
- package/src/hashTree/hashTreeParser.ts +43 -1
- package/test/unit/spec/hashTree/hashTree.ts +66 -0
- package/test/unit/spec/hashTree/hashTreeParser.ts +493 -0
package/dist/breakouts/index.js
CHANGED
|
@@ -1109,7 +1109,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
|
|
|
1109
1109
|
this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
|
|
1110
1110
|
}
|
|
1111
1111
|
},
|
|
1112
|
-
version: "3.11.0-next.
|
|
1112
|
+
version: "3.11.0-next.14"
|
|
1113
1113
|
});
|
|
1114
1114
|
var _default = exports.default = Breakouts;
|
|
1115
1115
|
//# sourceMappingURL=index.js.map
|
|
@@ -413,6 +413,24 @@ var HashTree = /*#__PURE__*/function () {
|
|
|
413
413
|
return items;
|
|
414
414
|
}
|
|
415
415
|
|
|
416
|
+
/**
|
|
417
|
+
* Retrieves the version of a specific item by its id and type.
|
|
418
|
+
* @param {number} id The ID of the item.
|
|
419
|
+
* @param {ObjectType} type The type of the item.
|
|
420
|
+
* @returns {number | undefined} The version of the item if found, undefined otherwise.
|
|
421
|
+
*/
|
|
422
|
+
}, {
|
|
423
|
+
key: "getItemVersion",
|
|
424
|
+
value: function getItemVersion(id, type) {
|
|
425
|
+
var _this$leaves$index, _this$leaves$index$ty;
|
|
426
|
+
if (this.numLeaves === 0) {
|
|
427
|
+
return undefined;
|
|
428
|
+
}
|
|
429
|
+
var index = id % this.numLeaves;
|
|
430
|
+
var item = (_this$leaves$index = this.leaves[index]) === null || _this$leaves$index === void 0 ? void 0 : (_this$leaves$index$ty = _this$leaves$index[type]) === null || _this$leaves$index$ty === void 0 ? void 0 : _this$leaves$index$ty[id];
|
|
431
|
+
return item === null || item === void 0 ? void 0 : item.version;
|
|
432
|
+
}
|
|
433
|
+
|
|
416
434
|
/**
|
|
417
435
|
* Resizes the HashTree to have a new number of leaf nodes, redistributing all existing items.
|
|
418
436
|
* @param {number} newNumLeaves The new number of leaf nodes (must be 0 or a power of 2).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_xxh","require","_constants","_createForOfIteratorHelper","r","e","t","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","o","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","HashTree","leafData","numLeaves","_classCallCheck2","default","_defineProperty2","Error","concat","leafHashes","fill","EMPTY_HASH","leaves","map","putItems","_createClass2","key","_putItemInternal","item","put","index","id","type","existingItem","version","putItem","_this$_putItemInterna","computeLeafHash","items","_this","results","changedLeafIndexes","_set","forEach","_this$_putItemInterna2","push","add","_removeItemInternal","removed","_keys","removeItem","_this$_removeItemInte","removeItems","_this2","_this2$_removeItemInt","updateItems","itemUpdates","_this3","_ref","operation","_this3$_removeItemInt","_this3$_putItemIntern","leafContent","totalItemsCount","reduce","count","buffer","Buffer","alloc","offset","itemTypes","sort","_values","b","writeBigInt64LE","BigInt","XXH3_128","padStart","computeTreeHashes","currentLevelHashes","_toConsumableArray2","allHashes","nextLevelHashes","i","leftHash","rightHash","input","from","subarray","reverse","unshift","apply","getHashes","getRootHash","getLeafCount","getTotalItemCount","_iterator","_step","leaf","_i","_Object$keys2","err","getLeafData","leafIndex","_i2","_Object$keys3","resize","newNumLeaves","allItems","_iterator2","_step2","_i3","_Object$keys4","diffHashes","externalHashes","differingLeafIndexes","externalLeafHashesStart","ownLeafHash","externalLeafHash","_default","exports"],"sources":["hashTree.ts"],"sourcesContent":["import {XXH3_128} from 'xxh3-ts/xxh3';\nimport {EMPTY_HASH} from './constants';\nimport {ObjectType} from './types';\n\nexport type LeafDataItem = {\n type: ObjectType;\n id: number;\n version: number;\n};\n\n/**\n * HashTree is a data structure that organizes items into leaves based on their IDs,\n */\nclass HashTree {\n leaves: Array<Record<string, Record<number, LeafDataItem>>>;\n\n leafHashes: Array<string>;\n readonly numLeaves: number;\n\n /**\n * Constructs a new HashTree.\n * @param {LeafDataItem[]} leafData Initial data to populate the tree.\n * @param {number} numLeaves The number of leaf nodes in the tree. Must be 0 or a power of 2.\n * @throws {Error} If numLeaves is not 0 or a power of 2.\n */\n constructor(leafData: LeafDataItem[], numLeaves: number) {\n // eslint-disable-next-line no-bitwise\n if ((numLeaves & (numLeaves - 1)) !== 0) {\n throw new Error(`Number of leaves must be a power of 2, saw ${numLeaves}`);\n }\n\n this.numLeaves = numLeaves;\n this.leafHashes = new Array(numLeaves).fill(EMPTY_HASH);\n\n this.leaves = new Array(numLeaves).fill(null).map(() => {\n return {};\n });\n\n if (leafData) {\n this.putItems(leafData);\n }\n }\n\n /**\n * Internal logic for adding or updating an item, without computing the leaf hash.\n * @param {LeafDataItem} item The item to add or update.\n * @returns {{put: boolean, index: (number|null)}} Object indicating if put and the leaf index.\n * @private\n */\n private _putItemInternal(item: LeafDataItem): {put: boolean; index: number | null} {\n if (this.numLeaves === 0) {\n return {put: false, index: null}; // Cannot add to a tree with 0 leaves\n }\n\n const index = item.id % this.numLeaves;\n\n if (!this.leaves[index][item.type]) {\n this.leaves[index][item.type] = {};\n }\n\n const existingItem = this.leaves[index][item.type][item.id];\n\n if (!existingItem || existingItem.version < item.version) {\n this.leaves[index][item.type][item.id] = item;\n\n return {put: true, index};\n }\n\n return {put: false, index: null};\n }\n\n /**\n * Adds or updates a single item in the hash tree.\n * @param {LeafDataItem} item The item to add or update.\n * @returns {boolean} True if the item was added or updated, false otherwise (e.g., older version or tree has 0 leaves).\n */\n putItem(item: LeafDataItem): boolean {\n const {put, index} = this._putItemInternal(item);\n\n if (put && index !== null) {\n this.computeLeafHash(index);\n }\n\n return put;\n }\n\n /**\n * Adds or updates multiple items in the hash tree.\n * @param {LeafDataItem[]} items The array of items to add or update.\n * @returns {boolean[]} An array of booleans indicating success for each item.\n */\n putItems(items: LeafDataItem[]): boolean[] {\n if (this.numLeaves === 0 && items.length > 0) {\n // Cannot add items to a tree with 0 leaves.\n return items.map(() => false);\n }\n const results: boolean[] = [];\n const changedLeafIndexes = new Set<number>();\n\n items.forEach((item) => {\n const {put, index} = this._putItemInternal(item);\n results.push(put);\n if (put && index !== null) {\n changedLeafIndexes.add(index);\n }\n });\n\n changedLeafIndexes.forEach((index) => {\n this.computeLeafHash(index);\n });\n\n return results;\n }\n\n /**\n * Internal logic for removing an item, without computing the leaf hash.\n * @param {LeafDataItem} item The item to remove.\n * @returns {{removed: boolean, index: (number|null)}} Object indicating if removed and the leaf index.\n * @private\n */\n private _removeItemInternal(item: LeafDataItem): {removed: boolean; index: number | null} {\n if (this.numLeaves === 0) {\n return {removed: false, index: null};\n }\n\n const index = item.id % this.numLeaves;\n\n if (\n this.leaves[index] &&\n this.leaves[index][item.type] &&\n this.leaves[index][item.type][item.id]\n ) {\n const existingItem = this.leaves[index][item.type][item.id];\n if (\n existingItem.id === item.id &&\n existingItem.type === item.type &&\n existingItem.version <= item.version\n ) {\n delete this.leaves[index][item.type][item.id];\n if (Object.keys(this.leaves[index][item.type]).length === 0) {\n delete this.leaves[index][item.type];\n }\n\n return {removed: true, index};\n }\n }\n\n return {removed: false, index: null};\n }\n\n /**\n * Removes a single item from the hash tree.\n * The removal is based on matching type, id, and the provided item's version\n * being greater than or equal to the existing item's version.\n * @param {LeafDataItem} item The item to remove.\n * @returns {boolean} True if the item was removed, false otherwise.\n */\n removeItem(item: LeafDataItem): boolean {\n const {removed, index} = this._removeItemInternal(item);\n\n if (removed && index !== null) {\n this.computeLeafHash(index);\n }\n\n return removed;\n }\n\n /**\n * Removes multiple items from the hash tree.\n * @param {LeafDataItem[]} items The array of items to remove.\n * @returns {boolean[]} An array of booleans indicating success for each item.\n */\n removeItems(items: LeafDataItem[]): boolean[] {\n if (this.numLeaves === 0 && items.length > 0) {\n return items.map(() => false);\n }\n\n const results: boolean[] = [];\n const changedLeafIndexes = new Set<number>();\n\n items.forEach((item) => {\n const {removed, index} = this._removeItemInternal(item);\n results.push(removed);\n if (removed && index !== null) {\n changedLeafIndexes.add(index);\n }\n });\n\n changedLeafIndexes.forEach((index) => {\n this.computeLeafHash(index);\n });\n\n return results;\n }\n\n /**\n * Updates multiple items in the hash tree.\n * This method can handle both updating and removing items based on the `operation` flag.\n *\n * @param {object[]} itemUpdates An array of objects containing `operation` flag and the `item` to update.\n * @returns {boolean[]} An array of booleans indicating success for each operation.\n */\n updateItems(itemUpdates: {operation: 'update' | 'remove'; item: LeafDataItem}[]): boolean[] {\n if (this.numLeaves === 0 && itemUpdates.length > 0) {\n return itemUpdates.map(() => false);\n }\n\n const results: boolean[] = [];\n const changedLeafIndexes = new Set<number>();\n\n itemUpdates.forEach(({operation, item}) => {\n if (operation === 'remove') {\n const {removed, index} = this._removeItemInternal(item);\n results.push(removed);\n if (removed && index !== null) {\n changedLeafIndexes.add(index);\n }\n } else {\n const {put, index} = this._putItemInternal(item);\n results.push(put);\n if (put && index !== null) {\n changedLeafIndexes.add(index);\n }\n }\n });\n\n changedLeafIndexes.forEach((index) => {\n this.computeLeafHash(index);\n });\n\n return results;\n }\n\n /**\n * Computes the hash for a specific leaf.\n * The hash is based on the sorted items within the leaf.\n * @param {number} index The index of the leaf to compute the hash for.\n * @returns {void}\n */\n computeLeafHash(index: number) {\n if (index < 0 || index >= this.numLeaves) {\n // nothing to do\n return;\n }\n const leafContent = this.leaves[index];\n\n const totalItemsCount = Object.keys(leafContent).reduce((count, type) => {\n return count + Object.keys(leafContent[type]).length;\n }, 0);\n const buffer = Buffer.alloc(totalItemsCount * 16);\n\n let offset = 0;\n\n // iterate through the item types lexicographically\n const itemTypes = Object.keys(leafContent).sort();\n itemTypes.forEach((type) => {\n // iterate through the items of this type in ascending order of ID\n const items = Object.values(leafContent[type]).sort(\n (a: LeafDataItem, b: LeafDataItem) => a.id - b.id\n );\n\n // add all the items id and version to the hasher\n items.forEach((item: LeafDataItem) => {\n buffer.writeBigInt64LE(BigInt(item.id), offset);\n buffer.writeBigInt64LE(BigInt(item.version), offset + 8);\n\n offset += 16;\n });\n });\n\n this.leafHashes[index] = XXH3_128(buffer, BigInt(0)).toString(16).padStart(32, '0');\n }\n\n /**\n * Computes all internal and leaf node hashes of the tree.\n * Internal node hashes are computed bottom-up from the leaf hashes.\n * @returns {string[]} An array of hash strings, with internal node hashes first, followed by leaf hashes.\n * Returns `[EMPTY_HASH]` if the tree has 0 leaves.\n */\n computeTreeHashes(): string[] {\n if (this.numLeaves === 0) {\n return [EMPTY_HASH];\n }\n\n let currentLevelHashes = [...this.leafHashes];\n const allHashes = [];\n\n while (currentLevelHashes.length > 1) {\n const nextLevelHashes: string[] = [];\n for (let i = 0; i < currentLevelHashes.length; i += 2) {\n const leftHash = currentLevelHashes[i];\n const rightHash = i + 1 < currentLevelHashes.length ? currentLevelHashes[i + 1] : leftHash;\n\n const input = Buffer.concat([\n Buffer.from(leftHash, 'hex').subarray(0, 8).reverse(),\n Buffer.from(leftHash, 'hex').subarray(8, 16).reverse(),\n Buffer.from(rightHash, 'hex').subarray(0, 8).reverse(),\n Buffer.from(rightHash, 'hex').subarray(8, 16).reverse(),\n ]);\n\n nextLevelHashes.push(XXH3_128(input, BigInt(0)).toString(16).padStart(32, '0'));\n }\n currentLevelHashes = nextLevelHashes;\n allHashes.unshift(...currentLevelHashes);\n }\n\n return [...allHashes, ...this.leafHashes];\n }\n\n /**\n * Returns all hashes in the tree (internal nodes then leaf nodes).\n * @returns {string[]} An array of hash strings.\n */\n getHashes(): string[] {\n return this.computeTreeHashes();\n }\n\n /**\n * Computes and returns the hash value of the root node.\n * @returns {string} The root hash of the entire tree. Returns `EMPTY_HASH` if the tree has 0 leaves.\n */\n getRootHash(): string {\n if (this.numLeaves === 0) {\n return EMPTY_HASH;\n }\n\n return this.computeTreeHashes()[0];\n }\n\n /**\n * Gets the number of leaves in the tree.\n * @returns {number} The number of leaves.\n */\n getLeafCount(): number {\n return this.numLeaves;\n }\n\n /**\n * Calculates the total number of items stored in the tree.\n * @returns {number} The total number of items.\n */\n getTotalItemCount(): number {\n let count = 0;\n for (const leaf of this.leaves) {\n for (const type of Object.keys(leaf)) {\n count += Object.keys(leaf[type]).length;\n }\n }\n\n return count;\n }\n\n /**\n * Retrieves all data items from a specific leaf.\n * @param {number} leafIndex The index of the leaf.\n * @returns {LeafDataItem[]} An array of LeafDataItem in the specified leaf, sorted by ID,\n * or an empty array if the index is invalid or leaf is empty.\n */\n getLeafData(leafIndex: number): LeafDataItem[] {\n if (leafIndex < 0 || leafIndex >= this.numLeaves) {\n return [];\n }\n const leafContent = this.leaves[leafIndex];\n const items: LeafDataItem[] = [];\n for (const type of Object.keys(leafContent)) {\n items.push(...Object.values(leafContent[type]));\n }\n // Optionally sort them if a specific order is required, e.g., by ID\n items.sort((a, b) => a.id - b.id);\n\n return items;\n }\n\n /**\n * Resizes the HashTree to have a new number of leaf nodes, redistributing all existing items.\n * @param {number} newNumLeaves The new number of leaf nodes (must be 0 or a power of 2).\n * @returns {boolean} true if the tree was resized, false if the size didn't change.\n * @throws {Error} if newNumLeaves is not 0 or a power of 2.\n */\n resize(newNumLeaves: number): boolean {\n // eslint-disable-next-line no-bitwise\n if (newNumLeaves < 0 || (newNumLeaves !== 0 && (newNumLeaves & (newNumLeaves - 1)) !== 0)) {\n throw new Error('New number of leaves must be 0 or a power of 2');\n }\n\n if (newNumLeaves === this.numLeaves) {\n return false;\n }\n\n const allItems: LeafDataItem[] = [];\n for (const leaf of this.leaves) {\n for (const type of Object.keys(leaf)) {\n allItems.push(...Object.values(leaf[type]));\n }\n }\n\n // Re-initialize\n // eslint-disable-next-line no-extra-semi\n (this as any).numLeaves = newNumLeaves; // Type assertion to update readonly property\n this.leafHashes = new Array(newNumLeaves).fill(EMPTY_HASH);\n this.leaves = new Array(newNumLeaves).fill(null).map(() => ({}));\n\n if (newNumLeaves > 0) {\n this.putItems(allItems); // Re-add items which will be re-assigned to leaves and re-hashed\n }\n\n return true;\n }\n\n /**\n * Compares the tree's leaf hashes with an external set of hashes and returns the indices of differing leaf nodes.\n * The externalHashes array is expected to contain all node hashes (internal followed by leaves),\n * similar to the output of getHashes().\n * @param {string[]} externalHashes An array of hash strings (internal node hashes then leaf hashes).\n * @returns {number[]} An array of indices of the leaf nodes that have different hashes.\n */\n diffHashes(externalHashes: string[]): number[] {\n if (this.numLeaves === 0) {\n // If this tree is empty, its hash is EMPTY_HASH.\n // It differs if externalHashes is not a single EMPTY_HASH.\n if (externalHashes && externalHashes.length === 1 && externalHashes[0] === EMPTY_HASH) {\n return []; // No differences\n }\n // An empty tree has no leaves to differ, so return an empty array\n // as no specific leaf indexes are different.\n\n return [];\n }\n\n // We are interested in comparing the leaf hashes part.\n // The externalHashes array should also have its leaf hashes at the end.\n const differingLeafIndexes: number[] = [];\n // Calculate where the leaf hashes would start in the externalHashes array,\n // assuming it has the same number of leaves as this tree.\n const externalLeafHashesStart = externalHashes.length - this.numLeaves;\n\n if (externalLeafHashesStart < 0) {\n // externalHashes is too short to contain a complete set of leaf hashes\n // corresponding to this tree's numLeaves.\n // In this case, consider all of this tree's leaves as \"different\".\n for (let i = 0; i < this.numLeaves; i += 1) {\n differingLeafIndexes.push(i);\n }\n\n return differingLeafIndexes;\n }\n\n // Compare each leaf hash\n for (let i = 0; i < this.numLeaves; i += 1) {\n const ownLeafHash = this.leafHashes[i];\n // externalLeafHash might be undefined if externalHashes is shorter than expected\n // but externalLeafHashesStart was non-negative, implying a structural mismatch.\n const externalLeafHash = externalHashes[externalLeafHashesStart + i];\n if (ownLeafHash !== externalLeafHash) {\n differingLeafIndexes.push(i);\n }\n }\n\n return differingLeafIndexes;\n }\n}\n\nexport default HashTree;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_xxh","require","_constants","_createForOfIteratorHelper","r","e","t","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","o","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","HashTree","leafData","numLeaves","_classCallCheck2","default","_defineProperty2","Error","concat","leafHashes","fill","EMPTY_HASH","leaves","map","putItems","_createClass2","key","_putItemInternal","item","put","index","id","type","existingItem","version","putItem","_this$_putItemInterna","computeLeafHash","items","_this","results","changedLeafIndexes","_set","forEach","_this$_putItemInterna2","push","add","_removeItemInternal","removed","_keys","removeItem","_this$_removeItemInte","removeItems","_this2","_this2$_removeItemInt","updateItems","itemUpdates","_this3","_ref","operation","_this3$_removeItemInt","_this3$_putItemIntern","leafContent","totalItemsCount","reduce","count","buffer","Buffer","alloc","offset","itemTypes","sort","_values","b","writeBigInt64LE","BigInt","XXH3_128","padStart","computeTreeHashes","currentLevelHashes","_toConsumableArray2","allHashes","nextLevelHashes","i","leftHash","rightHash","input","from","subarray","reverse","unshift","apply","getHashes","getRootHash","getLeafCount","getTotalItemCount","_iterator","_step","leaf","_i","_Object$keys2","err","getLeafData","leafIndex","_i2","_Object$keys3","getItemVersion","_this$leaves$index","_this$leaves$index$ty","undefined","resize","newNumLeaves","allItems","_iterator2","_step2","_i3","_Object$keys4","diffHashes","externalHashes","differingLeafIndexes","externalLeafHashesStart","ownLeafHash","externalLeafHash","_default","exports"],"sources":["hashTree.ts"],"sourcesContent":["import {XXH3_128} from 'xxh3-ts/xxh3';\nimport {EMPTY_HASH} from './constants';\nimport {ObjectType} from './types';\n\nexport type LeafDataItem = {\n type: ObjectType;\n id: number;\n version: number;\n};\n\n/**\n * HashTree is a data structure that organizes items into leaves based on their IDs,\n */\nclass HashTree {\n leaves: Array<Record<string, Record<number, LeafDataItem>>>;\n\n leafHashes: Array<string>;\n readonly numLeaves: number;\n\n /**\n * Constructs a new HashTree.\n * @param {LeafDataItem[]} leafData Initial data to populate the tree.\n * @param {number} numLeaves The number of leaf nodes in the tree. Must be 0 or a power of 2.\n * @throws {Error} If numLeaves is not 0 or a power of 2.\n */\n constructor(leafData: LeafDataItem[], numLeaves: number) {\n // eslint-disable-next-line no-bitwise\n if ((numLeaves & (numLeaves - 1)) !== 0) {\n throw new Error(`Number of leaves must be a power of 2, saw ${numLeaves}`);\n }\n\n this.numLeaves = numLeaves;\n this.leafHashes = new Array(numLeaves).fill(EMPTY_HASH);\n\n this.leaves = new Array(numLeaves).fill(null).map(() => {\n return {};\n });\n\n if (leafData) {\n this.putItems(leafData);\n }\n }\n\n /**\n * Internal logic for adding or updating an item, without computing the leaf hash.\n * @param {LeafDataItem} item The item to add or update.\n * @returns {{put: boolean, index: (number|null)}} Object indicating if put and the leaf index.\n * @private\n */\n private _putItemInternal(item: LeafDataItem): {put: boolean; index: number | null} {\n if (this.numLeaves === 0) {\n return {put: false, index: null}; // Cannot add to a tree with 0 leaves\n }\n\n const index = item.id % this.numLeaves;\n\n if (!this.leaves[index][item.type]) {\n this.leaves[index][item.type] = {};\n }\n\n const existingItem = this.leaves[index][item.type][item.id];\n\n if (!existingItem || existingItem.version < item.version) {\n this.leaves[index][item.type][item.id] = item;\n\n return {put: true, index};\n }\n\n return {put: false, index: null};\n }\n\n /**\n * Adds or updates a single item in the hash tree.\n * @param {LeafDataItem} item The item to add or update.\n * @returns {boolean} True if the item was added or updated, false otherwise (e.g., older version or tree has 0 leaves).\n */\n putItem(item: LeafDataItem): boolean {\n const {put, index} = this._putItemInternal(item);\n\n if (put && index !== null) {\n this.computeLeafHash(index);\n }\n\n return put;\n }\n\n /**\n * Adds or updates multiple items in the hash tree.\n * @param {LeafDataItem[]} items The array of items to add or update.\n * @returns {boolean[]} An array of booleans indicating success for each item.\n */\n putItems(items: LeafDataItem[]): boolean[] {\n if (this.numLeaves === 0 && items.length > 0) {\n // Cannot add items to a tree with 0 leaves.\n return items.map(() => false);\n }\n const results: boolean[] = [];\n const changedLeafIndexes = new Set<number>();\n\n items.forEach((item) => {\n const {put, index} = this._putItemInternal(item);\n results.push(put);\n if (put && index !== null) {\n changedLeafIndexes.add(index);\n }\n });\n\n changedLeafIndexes.forEach((index) => {\n this.computeLeafHash(index);\n });\n\n return results;\n }\n\n /**\n * Internal logic for removing an item, without computing the leaf hash.\n * @param {LeafDataItem} item The item to remove.\n * @returns {{removed: boolean, index: (number|null)}} Object indicating if removed and the leaf index.\n * @private\n */\n private _removeItemInternal(item: LeafDataItem): {removed: boolean; index: number | null} {\n if (this.numLeaves === 0) {\n return {removed: false, index: null};\n }\n\n const index = item.id % this.numLeaves;\n\n if (\n this.leaves[index] &&\n this.leaves[index][item.type] &&\n this.leaves[index][item.type][item.id]\n ) {\n const existingItem = this.leaves[index][item.type][item.id];\n if (\n existingItem.id === item.id &&\n existingItem.type === item.type &&\n existingItem.version <= item.version\n ) {\n delete this.leaves[index][item.type][item.id];\n if (Object.keys(this.leaves[index][item.type]).length === 0) {\n delete this.leaves[index][item.type];\n }\n\n return {removed: true, index};\n }\n }\n\n return {removed: false, index: null};\n }\n\n /**\n * Removes a single item from the hash tree.\n * The removal is based on matching type, id, and the provided item's version\n * being greater than or equal to the existing item's version.\n * @param {LeafDataItem} item The item to remove.\n * @returns {boolean} True if the item was removed, false otherwise.\n */\n removeItem(item: LeafDataItem): boolean {\n const {removed, index} = this._removeItemInternal(item);\n\n if (removed && index !== null) {\n this.computeLeafHash(index);\n }\n\n return removed;\n }\n\n /**\n * Removes multiple items from the hash tree.\n * @param {LeafDataItem[]} items The array of items to remove.\n * @returns {boolean[]} An array of booleans indicating success for each item.\n */\n removeItems(items: LeafDataItem[]): boolean[] {\n if (this.numLeaves === 0 && items.length > 0) {\n return items.map(() => false);\n }\n\n const results: boolean[] = [];\n const changedLeafIndexes = new Set<number>();\n\n items.forEach((item) => {\n const {removed, index} = this._removeItemInternal(item);\n results.push(removed);\n if (removed && index !== null) {\n changedLeafIndexes.add(index);\n }\n });\n\n changedLeafIndexes.forEach((index) => {\n this.computeLeafHash(index);\n });\n\n return results;\n }\n\n /**\n * Updates multiple items in the hash tree.\n * This method can handle both updating and removing items based on the `operation` flag.\n *\n * @param {object[]} itemUpdates An array of objects containing `operation` flag and the `item` to update.\n * @returns {boolean[]} An array of booleans indicating success for each operation.\n */\n updateItems(itemUpdates: {operation: 'update' | 'remove'; item: LeafDataItem}[]): boolean[] {\n if (this.numLeaves === 0 && itemUpdates.length > 0) {\n return itemUpdates.map(() => false);\n }\n\n const results: boolean[] = [];\n const changedLeafIndexes = new Set<number>();\n\n itemUpdates.forEach(({operation, item}) => {\n if (operation === 'remove') {\n const {removed, index} = this._removeItemInternal(item);\n results.push(removed);\n if (removed && index !== null) {\n changedLeafIndexes.add(index);\n }\n } else {\n const {put, index} = this._putItemInternal(item);\n results.push(put);\n if (put && index !== null) {\n changedLeafIndexes.add(index);\n }\n }\n });\n\n changedLeafIndexes.forEach((index) => {\n this.computeLeafHash(index);\n });\n\n return results;\n }\n\n /**\n * Computes the hash for a specific leaf.\n * The hash is based on the sorted items within the leaf.\n * @param {number} index The index of the leaf to compute the hash for.\n * @returns {void}\n */\n computeLeafHash(index: number) {\n if (index < 0 || index >= this.numLeaves) {\n // nothing to do\n return;\n }\n const leafContent = this.leaves[index];\n\n const totalItemsCount = Object.keys(leafContent).reduce((count, type) => {\n return count + Object.keys(leafContent[type]).length;\n }, 0);\n const buffer = Buffer.alloc(totalItemsCount * 16);\n\n let offset = 0;\n\n // iterate through the item types lexicographically\n const itemTypes = Object.keys(leafContent).sort();\n itemTypes.forEach((type) => {\n // iterate through the items of this type in ascending order of ID\n const items = Object.values(leafContent[type]).sort(\n (a: LeafDataItem, b: LeafDataItem) => a.id - b.id\n );\n\n // add all the items id and version to the hasher\n items.forEach((item: LeafDataItem) => {\n buffer.writeBigInt64LE(BigInt(item.id), offset);\n buffer.writeBigInt64LE(BigInt(item.version), offset + 8);\n\n offset += 16;\n });\n });\n\n this.leafHashes[index] = XXH3_128(buffer, BigInt(0)).toString(16).padStart(32, '0');\n }\n\n /**\n * Computes all internal and leaf node hashes of the tree.\n * Internal node hashes are computed bottom-up from the leaf hashes.\n * @returns {string[]} An array of hash strings, with internal node hashes first, followed by leaf hashes.\n * Returns `[EMPTY_HASH]` if the tree has 0 leaves.\n */\n computeTreeHashes(): string[] {\n if (this.numLeaves === 0) {\n return [EMPTY_HASH];\n }\n\n let currentLevelHashes = [...this.leafHashes];\n const allHashes = [];\n\n while (currentLevelHashes.length > 1) {\n const nextLevelHashes: string[] = [];\n for (let i = 0; i < currentLevelHashes.length; i += 2) {\n const leftHash = currentLevelHashes[i];\n const rightHash = i + 1 < currentLevelHashes.length ? currentLevelHashes[i + 1] : leftHash;\n\n const input = Buffer.concat([\n Buffer.from(leftHash, 'hex').subarray(0, 8).reverse(),\n Buffer.from(leftHash, 'hex').subarray(8, 16).reverse(),\n Buffer.from(rightHash, 'hex').subarray(0, 8).reverse(),\n Buffer.from(rightHash, 'hex').subarray(8, 16).reverse(),\n ]);\n\n nextLevelHashes.push(XXH3_128(input, BigInt(0)).toString(16).padStart(32, '0'));\n }\n currentLevelHashes = nextLevelHashes;\n allHashes.unshift(...currentLevelHashes);\n }\n\n return [...allHashes, ...this.leafHashes];\n }\n\n /**\n * Returns all hashes in the tree (internal nodes then leaf nodes).\n * @returns {string[]} An array of hash strings.\n */\n getHashes(): string[] {\n return this.computeTreeHashes();\n }\n\n /**\n * Computes and returns the hash value of the root node.\n * @returns {string} The root hash of the entire tree. Returns `EMPTY_HASH` if the tree has 0 leaves.\n */\n getRootHash(): string {\n if (this.numLeaves === 0) {\n return EMPTY_HASH;\n }\n\n return this.computeTreeHashes()[0];\n }\n\n /**\n * Gets the number of leaves in the tree.\n * @returns {number} The number of leaves.\n */\n getLeafCount(): number {\n return this.numLeaves;\n }\n\n /**\n * Calculates the total number of items stored in the tree.\n * @returns {number} The total number of items.\n */\n getTotalItemCount(): number {\n let count = 0;\n for (const leaf of this.leaves) {\n for (const type of Object.keys(leaf)) {\n count += Object.keys(leaf[type]).length;\n }\n }\n\n return count;\n }\n\n /**\n * Retrieves all data items from a specific leaf.\n * @param {number} leafIndex The index of the leaf.\n * @returns {LeafDataItem[]} An array of LeafDataItem in the specified leaf, sorted by ID,\n * or an empty array if the index is invalid or leaf is empty.\n */\n getLeafData(leafIndex: number): LeafDataItem[] {\n if (leafIndex < 0 || leafIndex >= this.numLeaves) {\n return [];\n }\n const leafContent = this.leaves[leafIndex];\n const items: LeafDataItem[] = [];\n for (const type of Object.keys(leafContent)) {\n items.push(...Object.values(leafContent[type]));\n }\n // Optionally sort them if a specific order is required, e.g., by ID\n items.sort((a, b) => a.id - b.id);\n\n return items;\n }\n\n /**\n * Retrieves the version of a specific item by its id and type.\n * @param {number} id The ID of the item.\n * @param {ObjectType} type The type of the item.\n * @returns {number | undefined} The version of the item if found, undefined otherwise.\n */\n getItemVersion(id: number, type: ObjectType): number | undefined {\n if (this.numLeaves === 0) {\n return undefined;\n }\n\n const index = id % this.numLeaves;\n const item = this.leaves[index]?.[type]?.[id];\n\n return item?.version;\n }\n\n /**\n * Resizes the HashTree to have a new number of leaf nodes, redistributing all existing items.\n * @param {number} newNumLeaves The new number of leaf nodes (must be 0 or a power of 2).\n * @returns {boolean} true if the tree was resized, false if the size didn't change.\n * @throws {Error} if newNumLeaves is not 0 or a power of 2.\n */\n resize(newNumLeaves: number): boolean {\n // eslint-disable-next-line no-bitwise\n if (newNumLeaves < 0 || (newNumLeaves !== 0 && (newNumLeaves & (newNumLeaves - 1)) !== 0)) {\n throw new Error('New number of leaves must be 0 or a power of 2');\n }\n\n if (newNumLeaves === this.numLeaves) {\n return false;\n }\n\n const allItems: LeafDataItem[] = [];\n for (const leaf of this.leaves) {\n for (const type of Object.keys(leaf)) {\n allItems.push(...Object.values(leaf[type]));\n }\n }\n\n // Re-initialize\n // eslint-disable-next-line no-extra-semi\n (this as any).numLeaves = newNumLeaves; // Type assertion to update readonly property\n this.leafHashes = new Array(newNumLeaves).fill(EMPTY_HASH);\n this.leaves = new Array(newNumLeaves).fill(null).map(() => ({}));\n\n if (newNumLeaves > 0) {\n this.putItems(allItems); // Re-add items which will be re-assigned to leaves and re-hashed\n }\n\n return true;\n }\n\n /**\n * Compares the tree's leaf hashes with an external set of hashes and returns the indices of differing leaf nodes.\n * The externalHashes array is expected to contain all node hashes (internal followed by leaves),\n * similar to the output of getHashes().\n * @param {string[]} externalHashes An array of hash strings (internal node hashes then leaf hashes).\n * @returns {number[]} An array of indices of the leaf nodes that have different hashes.\n */\n diffHashes(externalHashes: string[]): number[] {\n if (this.numLeaves === 0) {\n // If this tree is empty, its hash is EMPTY_HASH.\n // It differs if externalHashes is not a single EMPTY_HASH.\n if (externalHashes && externalHashes.length === 1 && externalHashes[0] === EMPTY_HASH) {\n return []; // No differences\n }\n // An empty tree has no leaves to differ, so return an empty array\n // as no specific leaf indexes are different.\n\n return [];\n }\n\n // We are interested in comparing the leaf hashes part.\n // The externalHashes array should also have its leaf hashes at the end.\n const differingLeafIndexes: number[] = [];\n // Calculate where the leaf hashes would start in the externalHashes array,\n // assuming it has the same number of leaves as this tree.\n const externalLeafHashesStart = externalHashes.length - this.numLeaves;\n\n if (externalLeafHashesStart < 0) {\n // externalHashes is too short to contain a complete set of leaf hashes\n // corresponding to this tree's numLeaves.\n // In this case, consider all of this tree's leaves as \"different\".\n for (let i = 0; i < this.numLeaves; i += 1) {\n differingLeafIndexes.push(i);\n }\n\n return differingLeafIndexes;\n }\n\n // Compare each leaf hash\n for (let i = 0; i < this.numLeaves; i += 1) {\n const ownLeafHash = this.leafHashes[i];\n // externalLeafHash might be undefined if externalHashes is shorter than expected\n // but externalLeafHashesStart was non-negative, implying a structural mismatch.\n const externalLeafHash = externalHashes[externalLeafHashesStart + i];\n if (ownLeafHash !== externalLeafHash) {\n differingLeafIndexes.push(i);\n }\n }\n\n return differingLeafIndexes;\n }\n}\n\nexport default HashTree;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,7 +5,7 @@ var _Array$from = require("@babel/runtime-corejs2/core-js/array/from");
|
|
|
5
5
|
var _Symbol = require("@babel/runtime-corejs2/core-js/symbol");
|
|
6
6
|
var _Symbol$iterator = require("@babel/runtime-corejs2/core-js/symbol/iterator");
|
|
7
7
|
var _Array$isArray2 = require("@babel/runtime-corejs2/core-js/array/is-array");
|
|
8
|
-
var _Object$
|
|
8
|
+
var _Object$keys4 = require("@babel/runtime-corejs2/core-js/object/keys");
|
|
9
9
|
var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
|
|
10
10
|
var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
|
|
11
11
|
var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
|
|
@@ -40,7 +40,7 @@ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy")
|
|
|
40
40
|
var _constants = require("../constants");
|
|
41
41
|
var _constants2 = require("./constants");
|
|
42
42
|
var _utils = require("./utils");
|
|
43
|
-
function ownKeys(e, r) { var t = _Object$
|
|
43
|
+
function ownKeys(e, r) { var t = _Object$keys4(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
44
44
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
45
45
|
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbol && r[_Symbol$iterator] || r["@@iterator"]; if (!t) { if (_Array$isArray2(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
|
|
46
46
|
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
@@ -1015,9 +1015,49 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1015
1015
|
}, {
|
|
1016
1016
|
key: "callLocusInfoUpdateCallback",
|
|
1017
1017
|
value: function callLocusInfoUpdateCallback(updates) {
|
|
1018
|
+
var _this8 = this;
|
|
1018
1019
|
var updateType = updates.updateType,
|
|
1019
1020
|
updatedObjects = updates.updatedObjects;
|
|
1020
|
-
if (updateType
|
|
1021
|
+
if (updateType === LocusInfoUpdateType.OBJECTS_UPDATED && (updatedObjects === null || updatedObjects === void 0 ? void 0 : updatedObjects.length) > 0) {
|
|
1022
|
+
// Filter out updates for objects that already have a higher version in their datasets,
|
|
1023
|
+
// or removals for objects that still exist in any of their datasets
|
|
1024
|
+
var filteredUpdates = updatedObjects.filter(function (object) {
|
|
1025
|
+
var elementId = object.htMeta.elementId;
|
|
1026
|
+
var type = elementId.type,
|
|
1027
|
+
id = elementId.id,
|
|
1028
|
+
version = elementId.version;
|
|
1029
|
+
|
|
1030
|
+
// Check all datasets
|
|
1031
|
+
for (var _i2 = 0, _Object$keys3 = (0, _keys.default)(_this8.dataSets); _i2 < _Object$keys3.length; _i2++) {
|
|
1032
|
+
var dataSetName = _Object$keys3[_i2];
|
|
1033
|
+
var dataSet = _this8.dataSets[dataSetName];
|
|
1034
|
+
|
|
1035
|
+
// only visible datasets have hash trees set
|
|
1036
|
+
if (dataSet !== null && dataSet !== void 0 && dataSet.hashTree) {
|
|
1037
|
+
var existingVersion = dataSet.hashTree.getItemVersion(id, type);
|
|
1038
|
+
if (existingVersion !== undefined) {
|
|
1039
|
+
if (object.data) {
|
|
1040
|
+
// For updates: filter out if any dataset has a higher version
|
|
1041
|
+
if (existingVersion > version) {
|
|
1042
|
+
_loggerProxy.default.logger.info("HashTreeParser#callLocusInfoUpdateCallback --> ".concat(_this8.debugId, " Filtering out update for ").concat(type, ":").concat(id, " v").concat(version, " because dataset \"").concat(dataSetName, "\" has v").concat(existingVersion));
|
|
1043
|
+
return false;
|
|
1044
|
+
}
|
|
1045
|
+
} else if (existingVersion >= version) {
|
|
1046
|
+
// For removals: filter out if the object still exists in any dataset
|
|
1047
|
+
_loggerProxy.default.logger.info("HashTreeParser#callLocusInfoUpdateCallback --> ".concat(_this8.debugId, " Filtering out removal for ").concat(type, ":").concat(id, " v").concat(version, " because dataset \"").concat(dataSetName, "\" still has v").concat(existingVersion));
|
|
1048
|
+
return false;
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
}
|
|
1053
|
+
return true;
|
|
1054
|
+
});
|
|
1055
|
+
if (filteredUpdates.length > 0) {
|
|
1056
|
+
this.locusInfoUpdateCallback(updateType, {
|
|
1057
|
+
updatedObjects: filteredUpdates
|
|
1058
|
+
});
|
|
1059
|
+
}
|
|
1060
|
+
} else if (updateType !== LocusInfoUpdateType.OBJECTS_UPDATED) {
|
|
1021
1061
|
this.locusInfoUpdateCallback(updateType, {
|
|
1022
1062
|
updatedObjects: updatedObjects
|
|
1023
1063
|
});
|
|
@@ -1048,7 +1088,7 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1048
1088
|
}, {
|
|
1049
1089
|
key: "runSyncAlgorithm",
|
|
1050
1090
|
value: function runSyncAlgorithm(receivedDataSet) {
|
|
1051
|
-
var
|
|
1091
|
+
var _this9 = this;
|
|
1052
1092
|
var dataSet = this.dataSets[receivedDataSet.name];
|
|
1053
1093
|
if (!dataSet) {
|
|
1054
1094
|
_loggerProxy.default.logger.warn("HashTreeParser#runSyncAlgorithm --> ".concat(this.debugId, " No data set found for ").concat(receivedDataSet.name, ", skipping sync algorithm"));
|
|
@@ -1070,7 +1110,7 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1070
1110
|
}
|
|
1071
1111
|
_loggerProxy.default.logger.info("HashTreeParser#runSyncAlgorithm --> ".concat(this.debugId, " setting \"").concat(dataSet.name, "\" sync timer for ").concat(delay));
|
|
1072
1112
|
dataSet.timer = setTimeout(/*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee7() {
|
|
1073
|
-
var rootHash, mismatchedLeavesData, receivedHashes, _yield$
|
|
1113
|
+
var rootHash, mismatchedLeavesData, receivedHashes, _yield$_this9$getHash, hashes, latestDataSetInfo, mismatchedLeaveIndexes, syncResponse, _t3;
|
|
1074
1114
|
return _regenerator.default.wrap(function (_context8) {
|
|
1075
1115
|
while (1) switch (_context8.prev = _context8.next) {
|
|
1076
1116
|
case 0:
|
|
@@ -1079,7 +1119,7 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1079
1119
|
_context8.next = 1;
|
|
1080
1120
|
break;
|
|
1081
1121
|
}
|
|
1082
|
-
_loggerProxy.default.logger.warn("HashTreeParser#runSyncAlgorithm --> ".concat(
|
|
1122
|
+
_loggerProxy.default.logger.warn("HashTreeParser#runSyncAlgorithm --> ".concat(_this9.debugId, " Data set \"").concat(dataSet.name, "\" no longer has a hash tree, cannot run sync algorithm"));
|
|
1083
1123
|
return _context8.abrupt("return");
|
|
1084
1124
|
case 1:
|
|
1085
1125
|
rootHash = dataSet.hashTree.getRootHash();
|
|
@@ -1087,7 +1127,7 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1087
1127
|
_context8.next = 11;
|
|
1088
1128
|
break;
|
|
1089
1129
|
}
|
|
1090
|
-
_loggerProxy.default.logger.info("HashTreeParser#runSyncAlgorithm --> ".concat(
|
|
1130
|
+
_loggerProxy.default.logger.info("HashTreeParser#runSyncAlgorithm --> ".concat(_this9.debugId, " Root hash mismatch: received=").concat(dataSet.root, ", ours=").concat(rootHash, ", syncing data set \"").concat(dataSet.name, "\""));
|
|
1091
1131
|
mismatchedLeavesData = {};
|
|
1092
1132
|
if (!(dataSet.leafCount !== 1)) {
|
|
1093
1133
|
_context8.next = 7;
|
|
@@ -1095,11 +1135,11 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1095
1135
|
}
|
|
1096
1136
|
_context8.prev = 2;
|
|
1097
1137
|
_context8.next = 3;
|
|
1098
|
-
return
|
|
1138
|
+
return _this9.getHashesFromLocus(dataSet.name);
|
|
1099
1139
|
case 3:
|
|
1100
|
-
_yield$
|
|
1101
|
-
hashes = _yield$
|
|
1102
|
-
latestDataSetInfo = _yield$
|
|
1140
|
+
_yield$_this9$getHash = _context8.sent;
|
|
1141
|
+
hashes = _yield$_this9$getHash.hashes;
|
|
1142
|
+
latestDataSetInfo = _yield$_this9$getHash.dataSet;
|
|
1103
1143
|
receivedHashes = hashes;
|
|
1104
1144
|
dataSet.hashTree.resize(latestDataSetInfo.leafCount);
|
|
1105
1145
|
_context8.next = 6;
|
|
@@ -1112,7 +1152,7 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1112
1152
|
break;
|
|
1113
1153
|
}
|
|
1114
1154
|
// this is a leaf count mismatch, we should do nothing, just wait for another heartbeat message from Locus
|
|
1115
|
-
_loggerProxy.default.logger.info("HashTreeParser#getHashesFromLocus --> ".concat(
|
|
1155
|
+
_loggerProxy.default.logger.info("HashTreeParser#getHashesFromLocus --> ".concat(_this9.debugId, " Got 409 when fetching hashes for data set \"").concat(dataSet.name, "\": ").concat(_t3.message));
|
|
1116
1156
|
return _context8.abrupt("return");
|
|
1117
1157
|
case 5:
|
|
1118
1158
|
throw _t3;
|
|
@@ -1132,19 +1172,19 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1132
1172
|
break;
|
|
1133
1173
|
}
|
|
1134
1174
|
_context8.next = 9;
|
|
1135
|
-
return
|
|
1175
|
+
return _this9.sendSyncRequestToLocus(dataSet, mismatchedLeavesData);
|
|
1136
1176
|
case 9:
|
|
1137
1177
|
syncResponse = _context8.sent;
|
|
1138
1178
|
// sync API may return nothing (in that case data will arrive via messages)
|
|
1139
1179
|
// or it may return a response in the same format as messages
|
|
1140
1180
|
if (syncResponse) {
|
|
1141
|
-
|
|
1181
|
+
_this9.handleMessage(syncResponse, 'via sync API');
|
|
1142
1182
|
}
|
|
1143
1183
|
case 10:
|
|
1144
1184
|
_context8.next = 12;
|
|
1145
1185
|
break;
|
|
1146
1186
|
case 11:
|
|
1147
|
-
_loggerProxy.default.logger.info("HashTreeParser#runSyncAlgorithm --> ".concat(
|
|
1187
|
+
_loggerProxy.default.logger.info("HashTreeParser#runSyncAlgorithm --> ".concat(_this9.debugId, " \"").concat(dataSet.name, "\" root hash matching: ").concat(rootHash, ", version=").concat(dataSet.version));
|
|
1148
1188
|
case 12:
|
|
1149
1189
|
case "end":
|
|
1150
1190
|
return _context8.stop();
|
|
@@ -1179,7 +1219,7 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1179
1219
|
}, {
|
|
1180
1220
|
key: "getHashesFromLocus",
|
|
1181
1221
|
value: function getHashesFromLocus(dataSetName) {
|
|
1182
|
-
var
|
|
1222
|
+
var _this0 = this;
|
|
1183
1223
|
_loggerProxy.default.logger.info("HashTreeParser#getHashesFromLocus --> ".concat(this.debugId, " Requesting hashes for data set \"").concat(dataSetName, "\""));
|
|
1184
1224
|
var dataSet = this.dataSets[dataSetName];
|
|
1185
1225
|
var url = "".concat(dataSet.url, "/hashtree");
|
|
@@ -1191,16 +1231,16 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1191
1231
|
var hashes = (_response$body = response.body) === null || _response$body === void 0 ? void 0 : _response$body.hashes;
|
|
1192
1232
|
var dataSetFromResponse = (_response$body2 = response.body) === null || _response$body2 === void 0 ? void 0 : _response$body2.dataSet;
|
|
1193
1233
|
if (!hashes || !(0, _isArray.default)(hashes)) {
|
|
1194
|
-
_loggerProxy.default.logger.warn("HashTreeParser#getHashesFromLocus --> ".concat(
|
|
1234
|
+
_loggerProxy.default.logger.warn("HashTreeParser#getHashesFromLocus --> ".concat(_this0.debugId, " Locus returned invalid hashes, response body="), response.body);
|
|
1195
1235
|
throw new Error("Locus returned invalid hashes: ".concat(hashes));
|
|
1196
1236
|
}
|
|
1197
|
-
_loggerProxy.default.logger.info("HashTreeParser#getHashesFromLocus --> ".concat(
|
|
1237
|
+
_loggerProxy.default.logger.info("HashTreeParser#getHashesFromLocus --> ".concat(_this0.debugId, " Received hashes for data set \"").concat(dataSetName, "\": ").concat((0, _stringify.default)(hashes)));
|
|
1198
1238
|
return {
|
|
1199
1239
|
hashes: hashes,
|
|
1200
1240
|
dataSet: dataSetFromResponse
|
|
1201
1241
|
};
|
|
1202
1242
|
}).catch(function (error) {
|
|
1203
|
-
_loggerProxy.default.logger.error("HashTreeParser#getHashesFromLocus --> ".concat(
|
|
1243
|
+
_loggerProxy.default.logger.error("HashTreeParser#getHashesFromLocus --> ".concat(_this0.debugId, " Error ").concat(error.statusCode, " fetching hashes for data set \"").concat(dataSetName, "\":"), error);
|
|
1204
1244
|
throw error;
|
|
1205
1245
|
});
|
|
1206
1246
|
}
|
|
@@ -1215,7 +1255,7 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1215
1255
|
}, {
|
|
1216
1256
|
key: "sendSyncRequestToLocus",
|
|
1217
1257
|
value: function sendSyncRequestToLocus(dataSet, mismatchedLeavesData) {
|
|
1218
|
-
var
|
|
1258
|
+
var _this1 = this;
|
|
1219
1259
|
_loggerProxy.default.logger.info("HashTreeParser#sendSyncRequestToLocus --> ".concat(this.debugId, " Sending sync request for data set \"").concat(dataSet.name, "\""));
|
|
1220
1260
|
var url = "".concat(dataSet.url, "/sync");
|
|
1221
1261
|
var body = {
|
|
@@ -1233,14 +1273,14 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1233
1273
|
uri: url,
|
|
1234
1274
|
body: body
|
|
1235
1275
|
}).then(function (resp) {
|
|
1236
|
-
_loggerProxy.default.logger.info("HashTreeParser#sendSyncRequestToLocus --> ".concat(
|
|
1276
|
+
_loggerProxy.default.logger.info("HashTreeParser#sendSyncRequestToLocus --> ".concat(_this1.debugId, " Sync request succeeded for \"").concat(dataSet.name, "\""));
|
|
1237
1277
|
if (!resp.body || (0, _lodash.isEmpty)(resp.body)) {
|
|
1238
|
-
_loggerProxy.default.logger.info("HashTreeParser#sendSyncRequestToLocus --> ".concat(
|
|
1278
|
+
_loggerProxy.default.logger.info("HashTreeParser#sendSyncRequestToLocus --> ".concat(_this1.debugId, " Got ").concat(resp.statusCode, " with empty body for sync request for data set \"").concat(dataSet.name, "\", data should arrive via messages"));
|
|
1239
1279
|
return null;
|
|
1240
1280
|
}
|
|
1241
1281
|
return resp.body;
|
|
1242
1282
|
}).catch(function (error) {
|
|
1243
|
-
_loggerProxy.default.logger.error("HashTreeParser#sendSyncRequestToLocus --> ".concat(
|
|
1283
|
+
_loggerProxy.default.logger.error("HashTreeParser#sendSyncRequestToLocus --> ".concat(_this1.debugId, " Error ").concat(error.statusCode, " sending sync request for data set \"").concat(dataSet.name, "\":"), error);
|
|
1244
1284
|
throw error;
|
|
1245
1285
|
});
|
|
1246
1286
|
}
|