@webex/plugin-meetings 3.12.0-next.53 → 3.12.0-next.55
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 +30 -27
- 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 +0 -1
- package/dist/locus-info/index.js.map +1 -1
- package/dist/meeting/index.js +25 -0
- package/dist/meeting/index.js.map +1 -1
- package/dist/metrics/constants.js +3 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/types/meeting/index.d.ts +6 -0
- package/dist/types/metrics/constants.d.ts +2 -0
- package/dist/types/reactions/reactions.type.d.ts +3 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +1 -1
- package/src/hashTree/hashTreeParser.ts +29 -31
- package/src/locus-info/index.ts +0 -4
- package/src/meeting/index.ts +29 -0
- package/src/metrics/constants.ts +2 -0
- package/src/reactions/reactions.type.ts +3 -0
- package/test/unit/spec/hashTree/hashTreeParser.ts +15 -0
- package/test/unit/spec/meeting/index.js +109 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_lodash","require","_hashTree","_interopRequireDefault","_loggerProxy","_metrics","_constants","_constants2","_constants3","_types","_types2","_utils","ownKeys","e","r","t","_Object$keys4","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray2","_unsupportedIterableToArray","_n","F","s","n","done","value","f","TypeError","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","Boolean","prototype","valueOf","LocusInfoUpdateType","exports","OBJECTS_UPDATED","MEETING_ENDED","LOCUS_NOT_FOUND","MeetingEndedError","_Error","_classCallCheck2","_inherits2","_createClass2","_wrapNativeSuper2","Error","LocusNotFoundError","_Error2","MetadataDataSetName","DataSetNames","SELF","PossibleSentinelMessageDataSetNames","MAIN","UNJOINED","HashTreeParser","options","_locus$links","_locus$links$resource","_locus$links$resource2","_options$metadata","_options$metadata2","_options$metadata2$vi","_promise","resolve","_options$initialLocus","initialLocus","dataSets","locus","debugId","webexRequest","locusInfoUpdateCallback","excludedDataSets","visibleDataSetsUrl","links","resources","visibleDataSets","url","setVisibleDataSets","metadata","state","LoggerProxy","logger","warn","concat","leafData","analyzeLocusHtMeta","analyzeMetadata","info","_stringify","map","ds","vds","_iterator","_step","dataSet","leafCount","hashTree","isVisibleDataSet","HashTree","undefined","err","key","_this","cloneDeep","isExcludedDataSet","some","dataSetName","addToVisibleDataSetsList","dataSetInfo","_initializeNewVisibleDataSet","_asyncToGenerator2","_regenerator","mark","_callee","visibleDataSetInfo","wrap","_context","prev","abrupt","enqueueSyncForDataset","syncQueueProcessingPromise","stop","initializeNewVisibleDataSet","_x","_x2","getAllVisibleDataSetsFromLocus","_this2","method","HTTP_VERBS","GET","uri","then","response","body","catch","error","checkForSentinelHttpResponse","_initializeFromMessage","_callee2","message","_context2","sent","initializeDataSets","initializeFromMessage","_x3","_initializeFromGetLociResponse","_callee3","_locus$links2","_locus$links2$resourc","_locus$links2$resourc2","_context3","initializeFromGetLociResponse","_x4","_initializeDataSets","_callee4","debugText","_iterator2","_step2","_t","_context4","sortByInitPriority","DATA_SET_INIT_PRIORITY","finish","_x5","_x6","_ref","_ref$copyData","copyData","leafInfo","findAndStoreMetaData","currentLocusPart","currentLocusPartName","_typeof2","htMeta","dataSetNames","_currentLocusPart$htM","elementId","type","id","version","newLeafInfo","toLowerCase","ObjectType","control","data","deleteNestedObjectsWithHtMeta","_iterator3","_step3","_isArray","_iterator4","entries","_step4","_step4$value","_slicedToArray2","index","item","_i","_Object$keys","_keys","hasOwnProperty","_htMeta$dataSetNames","_metadata$htMeta$elem","join","isEndMessage","_this3","root","EMPTY_HASH","includes","handleRootHashHeartBeatMessage","_this4","_ref2","updateDataSetInfo","runSyncAlgorithm","handleSyncErrors","callLocusInfoUpdateCallback","updateType","queueInitForNewVisibleDataSets","dataSetsRequiringInitialization","_this5","queueMicrotask","initializeNewVisibleDataSets","handleMetadataUpdate","updatedObjects","_this$dataSets$Metada","metadataUpdated","putItem","metadataObject","_this$checkForVisible","checkForVisibleDataSetChanges","changeDetected","removedDataSets","addedDataSets","processVisibleDataSetChanges","handleLocusUpdate","update","_this6","_iterator5","_step5","appliedChangesList","putItems","leaf","zip","_ref3","_ref4","changeApplied","receivedDataSet","idleMs","backoff","maxMs","exponent","updateDataSetLeafCount","newLeafCount","_dataSet$hashTree","resize","_this7","object","_object$data","isMetadata","newVisibleDataSets","nvs","every","deleteHashTree","timer","clearTimeout","heartbeatWatchdogTimer","_this8","removedObjects","_this8$dataSets$ds$na","i","numLeaves","_toConsumableArray2","getLeafData","rds","_iterator6","_step6","_initializeNewVisibleDataSets","_callee5","_this9","allDataSets","_iterator7","_step7","_loop","_t2","_context6","_context5","find","d","delegateYield","_x7","parseMessage","_message$locusStateEl","_this0","locusStateElements","metadataUpdates","updatedMetadataObjects","_iterator8","_step8","_this0$dataSets$dataS","_this$checkForVisible2","locusStateElementsForThisSet","updateItems","operation","_ref5","_ref6","handleMessage","heartbeatIntervalMs","stopAllTimers","resetHeartbeatWatchdogs","updates","_updates$updatedObjec","_this1","filteredUpdates","_i2","_Object$keys3","existingVersion","getItemVersion","getWeightedBackoffTime","randomValue","Math","random","round","pow","_performSync","_callee6","reason","isInitialization","rootHash","leavesData","receivedHashes","hashesResult","mismatchedLeaveIndexes","syncResponse","_t3","_t4","_context7","getRootHash","getHashesFromLocus","hashes","statusCode","diffHashes","sendSyncRequestToLocus","mismatchedLeavesData","performSync","_x8","_x9","_x0","existingEntry","syncQueue","entry","isSyncInProgress","processSyncQueue","_processSyncQueue","_callee7","_ref7","_context8","shift","_syncAllDatasets","_callee8","dataSetsWithHashTrees","sorted","_iterator9","_step9","_context9","isSyncAllInProgress","_values","syncAllDatasets","_this10","delay","setTimeout","receivedDataSets","_this11","_iterator0","_step0","_loop2","backoffTime","cleanUp","resumeFromMessage","_message$locusStateEl2","_metadataObject$data","el","_iterator1","_step1","_resumeFromApiResponse","_callee9","_context0","resumeFromApiResponse","_x1","_error$body","isValidDataSetForSentinel","errorCode","LocusErrorCodes","LOCUS_INACTIVE","_error$body2","currentRootHash","_this12","qs","_response$body","_response$body2","isEmpty","dataSetFromResponse","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","HASH_TREE_SYNC_FAILURE","request","_this13","leafDataEntries","leafIndex","elementIds","_parseInt2","ourCurrentRootHash","POST","resp","_default"],"sources":["hashTreeParser.ts"],"sourcesContent":["import {cloneDeep, isEmpty, zip} from 'lodash';\nimport HashTree, {LeafDataItem} from './hashTree';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport {Enum, HTTP_VERBS} from '../constants';\nimport {DataSetNames, DATA_SET_INIT_PRIORITY, EMPTY_HASH} from './constants';\nimport {ObjectType, HtMeta, HashTreeObject} from './types';\nimport {LocusDTO, LocusErrorCodes} from '../locus-info/types';\nimport {deleteNestedObjectsWithHtMeta, isMetadata, sortByInitPriority} from './utils';\n\nexport interface DataSet {\n url: string;\n root: string;\n version: number;\n leafCount: number;\n name: string;\n idleMs: number;\n backoff: {\n maxMs: number;\n exponent: number;\n };\n}\n\nexport interface RootHashMessage {\n dataSets: Array<DataSet>;\n}\nexport interface HashTreeMessage {\n dataSets: Array<DataSet>;\n visibleDataSetsUrl: string; // url from which we can get more info about all data sets - now it seems to be visibleDataSetsUrl\n locusStateElements?: Array<HashTreeObject>;\n locusSessionId?: string;\n locusUrl: string;\n heartbeatIntervalMs?: number;\n}\n\nexport interface VisibleDataSetInfo {\n name: string;\n url: string;\n dataChannelUrl?: string;\n}\n\nexport interface Metadata {\n htMeta: HtMeta;\n visibleDataSets: VisibleDataSetInfo[];\n}\n\ninterface InternalDataSet extends DataSet {\n hashTree?: HashTree; // set only for visible data sets\n timer?: ReturnType<typeof setTimeout>;\n heartbeatWatchdogTimer?: ReturnType<typeof setTimeout>;\n}\n\ntype WebexRequestMethod = (options: Record<string, any>) => Promise<any>;\n\nexport const LocusInfoUpdateType = {\n OBJECTS_UPDATED: 'OBJECTS_UPDATED',\n MEETING_ENDED: 'MEETING_ENDED',\n LOCUS_NOT_FOUND: 'LOCUS_NOT_FOUND',\n} as const;\n\nexport type LocusInfoUpdateType = Enum<typeof LocusInfoUpdateType>;\n\ninterface LocusUpdatePayloads {\n [LocusInfoUpdateType.OBJECTS_UPDATED]: {updatedObjects: HashTreeObject[]};\n [LocusInfoUpdateType.MEETING_ENDED]: unknown; // No extra data\n [LocusInfoUpdateType.LOCUS_NOT_FOUND]: unknown; // No extra data\n}\n\nexport type LocusInfoUpdate = {\n [K in keyof LocusUpdatePayloads]: {\n updateType: K;\n } & LocusUpdatePayloads[K];\n}[keyof LocusUpdatePayloads];\n\nexport type LocusInfoUpdateCallback = (update: LocusInfoUpdate) => void;\n\ninterface LeafInfo {\n type: ObjectType;\n id: number;\n version: number;\n data?: any;\n}\n\n/**\n * This error is thrown if we receive information that the meeting has ended while we're processing some hash messages.\n * It's handled internally by HashTreeParser and results in MEETING_ENDED being sent up.\n */\nexport class MeetingEndedError extends Error {}\n\n/**\n * This error is thrown when a 404 is received from Locus hash tree endpoints, indicating that the locus URL\n * is no longer valid (e.g. participant moved to a breakout room, or meeting ended).\n * It's handled internally by HashTreeParser and results in LOCUS_NOT_FOUND being sent up.\n */\nexport class LocusNotFoundError extends Error {}\n\n/* Currently Locus always sends Metadata objects only in the \"self\" dataset.\n * If this ever changes, update all the code that relies on this constant.\n */\nconst MetadataDataSetName = DataSetNames.SELF;\n\nconst PossibleSentinelMessageDataSetNames = [\n DataSetNames.MAIN,\n DataSetNames.SELF,\n DataSetNames.UNJOINED,\n];\n\n/**\n * Parses hash tree eventing locus data\n */\nclass HashTreeParser {\n dataSets: Record<string, InternalDataSet> = {};\n visibleDataSetsUrl: string; // url from which we can get info about all data sets\n webexRequest: WebexRequestMethod;\n locusInfoUpdateCallback: LocusInfoUpdateCallback;\n visibleDataSets: VisibleDataSetInfo[];\n debugId: string;\n heartbeatIntervalMs?: number;\n private excludedDataSets: string[];\n state: 'active' | 'stopped';\n private syncQueue: Array<{dataSetName: string; reason: string; isInitialization?: boolean}> = [];\n private isSyncInProgress = false;\n private isSyncAllInProgress = false;\n private syncQueueProcessingPromise: Promise<void> = Promise.resolve();\n\n /**\n * Constructor for HashTreeParser\n * @param {Object} options\n * @param {Object} options.initialLocus The initial locus data containing the hash tree information\n */\n constructor(options: {\n initialLocus: {\n dataSets: Array<DataSet>;\n locus: any;\n };\n metadata: Metadata | null;\n webexRequest: WebexRequestMethod;\n locusInfoUpdateCallback: LocusInfoUpdateCallback;\n debugId: string;\n excludedDataSets?: string[];\n }) {\n const {dataSets, locus} = options.initialLocus; // extract dataSets from initialLocus\n\n this.debugId = options.debugId;\n this.webexRequest = options.webexRequest;\n this.locusInfoUpdateCallback = options.locusInfoUpdateCallback;\n this.excludedDataSets = options.excludedDataSets || [];\n this.visibleDataSetsUrl = locus?.links?.resources?.visibleDataSets?.url;\n this.setVisibleDataSets(options.metadata?.visibleDataSets || [], dataSets);\n\n this.state = 'active';\n\n if (options.metadata?.visibleDataSets?.length === 0) {\n LoggerProxy.logger.warn(\n `HashTreeParser#constructor --> ${this.debugId} No visibleDataSets found in Metadata`\n );\n }\n // object mapping dataset names to arrays of leaf data\n const leafData = this.analyzeLocusHtMeta(locus);\n\n if (options.metadata) {\n // add also the metadata that's outside of locus object itself\n this.analyzeMetadata(leafData, options.metadata);\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#constructor --> ${\n this.debugId\n } creating HashTreeParser for datasets: ${JSON.stringify(\n dataSets.map((ds) => ds.name)\n )} with visible datasets: ${JSON.stringify(this.visibleDataSets.map((vds) => vds.name))}`\n );\n\n for (const dataSet of dataSets) {\n const {name, leafCount} = dataSet;\n\n this.dataSets[name] = {\n ...dataSet,\n hashTree: this.isVisibleDataSet(name)\n ? new HashTree(leafData[name] || [], leafCount)\n : undefined,\n };\n }\n }\n\n /**\n * Sets the visible data sets list for the HashTreeParser. This method should be called only at the start, to initialize\n * the visible data sets, before any message processsing, so for example from the constructor or when resuming the parser.\n *\n * @param {Array<VisibleDataSetInfo>} visibleDataSets - The visible data sets to set\n * @param {Array<DataSet>} dataSets - The \"dataSets\" list from Locus (yes, Locus sends visibleDataSets and dataSets as separate lists and they can differ)\n * @returns {void}\n */\n private setVisibleDataSets(visibleDataSets: VisibleDataSetInfo[], dataSets: Array<DataSet>) {\n this.visibleDataSets = cloneDeep(visibleDataSets).filter(\n (vds) =>\n // exclude data sets we will never care about\n !this.isExcludedDataSet(vds.name) &&\n // and make sure that visibleDataSets list is consistent with dataSets list\n dataSets.some((ds) => ds.name === vds.name)\n );\n }\n\n /**\n * Checks if the given data set name is in the list of visible data sets\n * @param {string} dataSetName data set name to check\n * @returns {Boolean} True if the data set is visible, false otherwise\n */\n private isVisibleDataSet(dataSetName: string): boolean {\n return this.visibleDataSets.some((vds) => vds.name === dataSetName);\n }\n\n /**\n * Checks if the given data set name is in the excluded list\n * @param {string} dataSetName data set name to check\n * @returns {boolean} True if the data set is excluded, false otherwise\n */\n private isExcludedDataSet(dataSetName: string): boolean {\n return this.excludedDataSets.some((name) => name === dataSetName);\n }\n\n /**\n * Adds a data set to the visible data sets list, unless it is in the excluded list.\n * @param {VisibleDataSetInfo} dataSetInfo data set info to add\n * @returns {boolean} True if the data set was added, false if it was excluded\n */\n private addToVisibleDataSetsList(dataSetInfo: VisibleDataSetInfo): boolean {\n if (this.isExcludedDataSet(dataSetInfo.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#addToVisibleDataSetsList --> ${this.debugId} Data set \"${dataSetInfo.name}\" is in the excluded list, ignoring`\n );\n\n return false;\n }\n\n this.visibleDataSets.push(dataSetInfo);\n\n return true;\n }\n\n /**\n * Initializes a new visible data set by creating a hash tree for it, adding it to all the internal structures,\n * and sending an initial sync request to Locus with empty leaf data - that will trigger Locus to gives us all the data\n * from that dataset (in the response or via messages).\n *\n * @param {VisibleDataSetInfo} visibleDataSetInfo Information about the new visible data set\n * @param {DataSet} dataSetInfo The new data set to be added\n * @returns {Promise}\n */\n private async initializeNewVisibleDataSet(\n visibleDataSetInfo: VisibleDataSetInfo,\n dataSetInfo: DataSet\n ): Promise<void> {\n if (this.isVisibleDataSet(dataSetInfo.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSet --> ${this.debugId} Data set \"${dataSetInfo.name}\" already exists, skipping init`\n );\n\n return;\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSet --> ${this.debugId} Adding visible data set \"${dataSetInfo.name}\"`\n );\n\n if (!this.addToVisibleDataSetsList(visibleDataSetInfo)) {\n return;\n }\n\n const hashTree = new HashTree([], dataSetInfo.leafCount);\n\n this.dataSets[dataSetInfo.name] = {\n ...dataSetInfo,\n hashTree,\n };\n\n this.enqueueSyncForDataset(dataSetInfo.name, 'new visible data set initialization', true);\n await this.syncQueueProcessingPromise;\n }\n\n /**\n * Queries Locus for all up-to-date information about all visible data sets\n *\n * @returns {Promise}\n */\n private getAllVisibleDataSetsFromLocus() {\n if (!this.visibleDataSetsUrl) {\n LoggerProxy.logger.warn(\n `HashTreeParser#getAllVisibleDataSetsFromLocus --> ${this.debugId} No visibleDataSetsUrl, cannot get data sets information`\n );\n\n return Promise.resolve([]);\n }\n\n return this.webexRequest({\n method: HTTP_VERBS.GET,\n uri: this.visibleDataSetsUrl,\n })\n .then((response) => {\n return response.body.dataSets as Array<DataSet>;\n })\n .catch((error) => {\n this.checkForSentinelHttpResponse(error);\n\n throw error;\n });\n }\n\n /**\n * Initializes the hash tree parser from a message received from Locus.\n *\n * @param {HashTreeMessage} message - initial hash tree message received from Locus\n * @returns {Promise}\n */\n async initializeFromMessage(message: HashTreeMessage) {\n this.visibleDataSetsUrl = message.visibleDataSetsUrl;\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeFromMessage --> ${this.debugId} visibleDataSetsUrl=${this.visibleDataSetsUrl}`\n );\n const visibleDataSets = await this.getAllVisibleDataSetsFromLocus();\n\n await this.initializeDataSets(visibleDataSets, 'initialization from message');\n }\n\n /**\n * Initializes the hash tree parser from GET /loci API response by fetching all data sets metadata\n * first and then doing an initialization sync on each data set\n *\n * This function requires that this.visibleDataSets have been already populated correctly by the constructor.\n *\n * @param {LocusDTO} locus - locus object received from GET /loci\n * @returns {Promise}\n */\n async initializeFromGetLociResponse(locus: LocusDTO) {\n if (!locus?.links?.resources?.visibleDataSets?.url) {\n LoggerProxy.logger.warn(\n `HashTreeParser#initializeFromGetLociResponse --> ${this.debugId} missing visibleDataSets url in GET Loci response, cannot initialize hash trees`\n );\n\n return;\n }\n this.visibleDataSetsUrl = locus.links.resources.visibleDataSets.url;\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeFromGetLociResponse --> ${this.debugId} visibleDataSets url: ${this.visibleDataSetsUrl}`\n );\n\n const visibleDataSets = await this.getAllVisibleDataSetsFromLocus();\n\n await this.initializeDataSets(visibleDataSets, 'initialization from GET /loci response');\n }\n\n /**\n * Initializes data sets by doing an initialization sync on each visible data set that doesn't have a hash tree yet.\n *\n * @param {DataSet[]} visibleDataSets Array of visible DataSet objects to initialize\n * @param {string} debugText Text to include in logs for debugging purposes\n * @returns {Promise}\n */\n private async initializeDataSets(visibleDataSets: Array<DataSet>, debugText: string) {\n if (this.state === 'stopped') {\n return;\n }\n\n for (const dataSet of sortByInitPriority(visibleDataSets, DATA_SET_INIT_PRIORITY)) {\n const {name, leafCount, url} = dataSet;\n\n if (!this.dataSets[name]) {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeDataSets --> ${this.debugId} initializing dataset \"${name}\" (${debugText})`\n );\n\n this.dataSets[name] = {\n ...dataSet,\n };\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeDataSets --> ${this.debugId} dataset \"${name}\" already exists (${debugText})`\n );\n }\n\n if (!this.isVisibleDataSet(name)) {\n if (\n !this.addToVisibleDataSetsList({\n name,\n url,\n })\n ) {\n // dataset is excluded, skip it\n // eslint-disable-next-line no-continue\n continue;\n }\n }\n\n if (!this.dataSets[name].hashTree) {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeDataSets --> ${this.debugId} creating hash tree for visible dataset \"${name}\" (${debugText})`\n );\n this.dataSets[name].hashTree = new HashTree([], leafCount);\n\n this.enqueueSyncForDataset(name, `initialization sync for ${debugText}`, true);\n }\n }\n\n // wait for all enqueued initialization syncs to complete\n await this.syncQueueProcessingPromise;\n }\n\n /**\n * Each dataset exists at a different place in the dto\n * iterate recursively over the locus and if it has a htMeta key,\n * create an object with the type, id and version and add it to the appropriate leafData array\n *\n * @param {any} locus - The current part of the locus being processed\n * @param {Object} [options]\n * @param {boolean} [options.copyData=false] - Whether to copy the data for each leaf into returned result\n * @returns {any} - An object mapping dataset names to arrays of leaf data\n */\n private analyzeLocusHtMeta(locus: any, options?: {copyData?: boolean}) {\n const {copyData = false} = options || {};\n // object mapping dataset names to arrays of leaf data\n const leafInfo: Record<string, Array<LeafInfo>> = {};\n\n const findAndStoreMetaData = (currentLocusPart: any, currentLocusPartName: string) => {\n if (typeof currentLocusPart !== 'object' || currentLocusPart === null) {\n return;\n }\n\n if (currentLocusPart.htMeta && currentLocusPart.htMeta.dataSetNames) {\n const {type, id, version} = currentLocusPart.htMeta.elementId;\n const {dataSetNames} = currentLocusPart.htMeta;\n const newLeafInfo: LeafInfo = {\n type,\n id,\n version,\n };\n\n if (copyData) {\n if ((type as string).toLowerCase() === ObjectType.control) {\n // control entries require special handling, because they are signalled by Locus\n // differently when coming in messages vs API responses\n newLeafInfo.data = {\n [currentLocusPartName]: cloneDeep(currentLocusPart),\n };\n } else {\n newLeafInfo.data = cloneDeep(currentLocusPart);\n\n // remove any nested other objects that have their own htMeta\n deleteNestedObjectsWithHtMeta(newLeafInfo.data);\n }\n }\n\n for (const dataSetName of dataSetNames) {\n if (!leafInfo[dataSetName]) {\n leafInfo[dataSetName] = [];\n }\n leafInfo[dataSetName].push(newLeafInfo);\n }\n }\n\n if (Array.isArray(currentLocusPart)) {\n for (const [index, item] of currentLocusPart.entries()) {\n findAndStoreMetaData(item, index.toString());\n }\n } else {\n for (const key of Object.keys(currentLocusPart)) {\n if (Object.prototype.hasOwnProperty.call(currentLocusPart, key)) {\n findAndStoreMetaData(currentLocusPart[key], key);\n }\n }\n }\n };\n\n findAndStoreMetaData(locus, 'locus');\n\n return leafInfo;\n }\n\n /**\n * Analyzes the Metadata object that is sent outside of Locus object, and appends its data to passed in leafInfo\n * structure.\n *\n * @param {Record<string, LeafInfo[]>} leafInfo the structure to which the Metadata info will be appended\n * @param {Metadata} metadata Metadata object\n * @returns {void}\n */\n private analyzeMetadata(leafInfo: Record<string, LeafInfo[]>, metadata: Metadata) {\n const {htMeta} = metadata;\n\n if (\n htMeta?.dataSetNames?.length === 1 &&\n htMeta.dataSetNames[0].toLowerCase() === MetadataDataSetName\n ) {\n const {type, id, version} = metadata.htMeta.elementId;\n\n const dataSetName = htMeta.dataSetNames[0];\n\n if (!leafInfo[dataSetName]) {\n leafInfo[dataSetName] = [];\n }\n\n leafInfo[dataSetName].push({\n type,\n id,\n version,\n });\n } else {\n throw new Error(\n `${this.debugId} Metadata htMeta has unexpected dataSetNames: ${\n htMeta && htMeta.dataSetNames.join(',')\n }`\n );\n }\n }\n\n /**\n * Checks if the provided hash tree message indicates the end of the meeting and that there won't be any more updates.\n *\n * @param {HashTreeMessage} message - The hash tree message to check\n * @returns {boolean} - Returns true if the message indicates the end of the meeting, false otherwise\n */\n private isEndMessage(message: HashTreeMessage) {\n return message.dataSets.some((dataSet) => {\n if (\n dataSet.leafCount === 1 &&\n dataSet.root === EMPTY_HASH &&\n (!this.dataSets[dataSet.name] || this.dataSets[dataSet.name].version < dataSet.version) &&\n PossibleSentinelMessageDataSetNames.includes(dataSet.name.toLowerCase())\n ) {\n // this is a special way for Locus to indicate that this meeting has ended\n return true;\n }\n\n return false;\n });\n }\n\n /**\n * Handles the root hash heartbeat message\n *\n * @param {RootHashMessage} message - The root hash heartbeat message\n * @returns {void}\n */\n private handleRootHashHeartBeatMessage(message: RootHashMessage): void {\n const {dataSets} = message;\n\n LoggerProxy.logger.info(\n `HashTreeParser#handleRootHashMessage --> ${\n this.debugId\n } Received heartbeat root hash message with data sets: ${JSON.stringify(\n dataSets.map(({name, root, leafCount, version}) => ({\n name,\n root,\n leafCount,\n version,\n }))\n )}`\n );\n\n dataSets.forEach((dataSet) => {\n this.updateDataSetInfo(dataSet);\n this.runSyncAlgorithm(dataSet);\n });\n }\n\n /**\n * Handles known errors that can happen during syncs\n *\n * @param {any} error - The error to handle\n * @returns {boolean} true if the error was recognized and handled, false otherwise\n */\n private handleSyncErrors(error: any) {\n if (error instanceof MeetingEndedError) {\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.MEETING_ENDED,\n });\n\n return true;\n }\n if (error instanceof LocusNotFoundError) {\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.LOCUS_NOT_FOUND,\n });\n this.stop();\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Asynchronously initializes new visible data sets\n *\n * @param {VisibleDataSetInfo[]} dataSetsRequiringInitialization list of datasets to initialize\n * @returns {void}\n */\n private queueInitForNewVisibleDataSets(dataSetsRequiringInitialization: VisibleDataSetInfo[]) {\n LoggerProxy.logger.info(\n `HashTreeParser#queueInitForNewVisibleDataSets --> ${\n this.debugId\n } queuing initialization of new visible datasets: ${dataSetsRequiringInitialization\n .map((ds) => ds.name)\n .join(', ')}`\n );\n queueMicrotask(() => {\n this.initializeNewVisibleDataSets(dataSetsRequiringInitialization).catch((error) => {\n if (!this.handleSyncErrors(error)) {\n LoggerProxy.logger.warn(\n `HashTreeParser#queueInitForNewVisibleDataSets --> ${\n this.debugId\n } error while initializing new visible datasets: ${dataSetsRequiringInitialization\n .map((ds) => ds.name)\n .join(', ')}: `,\n error\n );\n }\n });\n });\n }\n\n /**\n * Handles updates to Metadata object that we receive from Locus via other means than messages. Right now\n * that means only in the API response alongside locus object.\n *\n * @param {Metadata} metadata received in Locus update other than a message (for example in an API response)\n * @param {HashTreeObject[]} updatedObjects a list of updated hash tree objects to which any updates resulting from new Metadata will be added\n * @returns {void}\n */\n handleMetadataUpdate(metadata: Metadata, updatedObjects: HashTreeObject[]): void {\n let dataSetsRequiringInitialization: VisibleDataSetInfo[] = [];\n\n // current assumption based on Locus docs is that Metadata object lives always in \"self\" data set\n const hashTree = this.dataSets[MetadataDataSetName]?.hashTree;\n\n if (!hashTree) {\n LoggerProxy.logger.warn(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received Metadata object but no hash tree for \"${MetadataDataSetName}\" data set exists`\n );\n } else {\n const metadataUpdated = hashTree.putItem(metadata.htMeta.elementId);\n\n if (metadataUpdated) {\n // metadata in Locus API response is in a slightly different format than the objects in messages, so need to adapt it\n const metadataObject: HashTreeObject = {\n htMeta: metadata.htMeta,\n data: metadata,\n };\n\n updatedObjects.push(metadataObject);\n\n const {changeDetected, removedDataSets, addedDataSets} = this.checkForVisibleDataSetChanges(\n [metadataObject]\n );\n\n if (changeDetected) {\n dataSetsRequiringInitialization = this.processVisibleDataSetChanges(\n removedDataSets,\n addedDataSets,\n updatedObjects\n );\n }\n\n if (dataSetsRequiringInitialization.length > 0) {\n // there are some data sets that we need to initialize asynchronously\n this.queueInitForNewVisibleDataSets(dataSetsRequiringInitialization);\n }\n }\n }\n }\n\n /**\n * This method should be called when we receive a partial locus DTO that contains dataSets and htMeta information\n * It updates the hash trees with the new leaf data based on the received Locus\n *\n * @param {Object} update - The locus update containing data sets and locus information\n * @returns {void}\n */\n handleLocusUpdate(update: {dataSets?: Array<DataSet>; locus: any; metadata?: Metadata}): void {\n if (this.state === 'stopped') {\n return;\n }\n\n const {dataSets, locus, metadata} = update;\n\n if (!dataSets) {\n // this happens for example when we handle GET /loci response\n LoggerProxy.logger.info(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received hash tree update without dataSets`\n );\n } else {\n for (const dataSet of dataSets) {\n this.updateDataSetInfo(dataSet);\n }\n }\n const updatedObjects: HashTreeObject[] = [];\n\n // first, analyze the locus object to extract the hash tree objects' htMeta and data from it\n const leafInfo = this.analyzeLocusHtMeta(locus, {copyData: true});\n\n // if we got metadata, process it (currently that means only potential visible data set list changes)\n if (metadata) {\n this.handleMetadataUpdate(metadata, updatedObjects);\n }\n\n // then process the data in hash trees, if it is a new version, then add it to updatedObjects\n Object.keys(leafInfo).forEach((dataSetName) => {\n if (this.dataSets[dataSetName]) {\n if (this.dataSets[dataSetName].hashTree) {\n const appliedChangesList = this.dataSets[dataSetName].hashTree.putItems(\n leafInfo[dataSetName].map((leaf) => ({\n id: leaf.id,\n type: leaf.type,\n version: leaf.version,\n }))\n );\n\n zip(appliedChangesList, leafInfo[dataSetName]).forEach(([changeApplied, leaf]) => {\n if (changeApplied) {\n updatedObjects.push({\n htMeta: {\n elementId: {\n type: leaf.type,\n id: leaf.id,\n version: leaf.version,\n },\n dataSetNames: [dataSetName],\n },\n data: leaf.data,\n });\n }\n });\n } else {\n // no hash tree means that the data set is not visible\n LoggerProxy.logger.warn(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received leaf data for data set \"${dataSetName}\" that has no hash tree created, ignoring`\n );\n }\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received leaf data for unknown data set \"${dataSetName}\", ignoring`\n );\n }\n });\n\n if (updatedObjects.length === 0) {\n LoggerProxy.logger.info(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} No objects updated as a result of received API response`\n );\n } else {\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.OBJECTS_UPDATED,\n updatedObjects,\n });\n }\n }\n\n /**\n * Updates the internal data set information based on the received data set from Locus.\n *\n * @param {DataSet} receivedDataSet - The latest data set information received from Locus to update the internal state.\n * @returns {void}\n */\n private updateDataSetInfo(receivedDataSet: DataSet) {\n if (!this.dataSets[receivedDataSet.name]) {\n this.dataSets[receivedDataSet.name] = {\n ...receivedDataSet,\n };\n\n LoggerProxy.logger.info(\n `HashTreeParser#updateDataSetInfo --> ${this.debugId} created entry for \"${receivedDataSet.name}\" dataset: version=${receivedDataSet.version}, root=${receivedDataSet.root}`\n );\n\n return;\n }\n // update our version of the dataSet\n if (this.dataSets[receivedDataSet.name].version < receivedDataSet.version) {\n this.dataSets[receivedDataSet.name].version = receivedDataSet.version;\n this.dataSets[receivedDataSet.name].root = receivedDataSet.root;\n this.dataSets[receivedDataSet.name].idleMs = receivedDataSet.idleMs;\n this.dataSets[receivedDataSet.name].backoff = {\n maxMs: receivedDataSet.backoff.maxMs,\n exponent: receivedDataSet.backoff.exponent,\n };\n LoggerProxy.logger.info(\n `HashTreeParser#updateDataSetInfo --> ${this.debugId} updated \"${receivedDataSet.name}\" dataset to version=${receivedDataSet.version}, root=${receivedDataSet.root}`\n );\n }\n }\n\n /**\n * Updates the leaf count for a data set, resizing its hash tree accordingly.\n *\n * @param {InternalDataSet} dataSet - The data set to update\n * @param {number} newLeafCount - The new leaf count\n * @returns {void}\n */\n private updateDataSetLeafCount(dataSet: InternalDataSet, newLeafCount: number): void {\n dataSet.hashTree?.resize(newLeafCount);\n dataSet.leafCount = newLeafCount;\n }\n\n /**\n * Checks for changes in the visible data sets based on the updated objects.\n * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects.\n * @returns {Object} An object containing the removed and added visible data sets.\n */\n private checkForVisibleDataSetChanges(updatedObjects: HashTreeObject[]) {\n let removedDataSets: VisibleDataSetInfo[] = [];\n let addedDataSets: VisibleDataSetInfo[] = [];\n\n // visibleDataSets can only be changed by Metadata object updates\n updatedObjects.forEach((object) => {\n if (isMetadata(object) && object.data?.visibleDataSets) {\n const newVisibleDataSets = object.data.visibleDataSets.filter(\n (vds) => !this.isExcludedDataSet(vds.name)\n );\n\n removedDataSets = this.visibleDataSets.filter(\n (ds) => !newVisibleDataSets.some((nvs) => nvs.name === ds.name)\n );\n addedDataSets = newVisibleDataSets.filter((nvs) =>\n this.visibleDataSets.every((ds) => ds.name !== nvs.name)\n );\n\n if (removedDataSets.length > 0 || addedDataSets.length > 0) {\n LoggerProxy.logger.info(\n `HashTreeParser#checkForVisibleDataSetChanges --> ${\n this.debugId\n } visible data sets change: removed: ${removedDataSets\n .map((ds) => ds.name)\n .join(', ')}, added: ${addedDataSets.map((ds) => ds.name).join(', ')}`\n );\n }\n }\n });\n\n return {\n changeDetected: removedDataSets.length > 0 || addedDataSets.length > 0,\n removedDataSets,\n addedDataSets,\n };\n }\n\n /**\n * Deletes the hash tree for the specified data set.\n *\n * @param {string} dataSetName name of the data set to delete\n * @returns {void}\n */\n private deleteHashTree(dataSetName: string) {\n this.dataSets[dataSetName].hashTree = undefined;\n\n // we also need to stop the timers as there is no hash tree anymore to sync\n if (this.dataSets[dataSetName].timer) {\n clearTimeout(this.dataSets[dataSetName].timer);\n this.dataSets[dataSetName].timer = undefined;\n }\n if (this.dataSets[dataSetName].heartbeatWatchdogTimer) {\n clearTimeout(this.dataSets[dataSetName].heartbeatWatchdogTimer);\n this.dataSets[dataSetName].heartbeatWatchdogTimer = undefined;\n }\n }\n\n /**\n * Adds entries to the passed in updateObjects array\n * for the changes that result from removing visible data sets and creates hash\n * trees for the new visible data sets, but without populating the hash trees.\n *\n * This function is synchronous. If we are missing information about some new\n * visible data sets and they require async initialization, the names of these data sets\n * are returned in an array.\n *\n * @param {VisibleDataSetInfo[]} removedDataSets - The list of removed data sets.\n * @param {VisibleDataSetInfo[]} addedDataSets - The list of added data sets.\n * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects to which changes will be added.\n * @returns {VisibleDataSetInfo[]} list of data sets that couldn't be initialized synchronously\n */\n private processVisibleDataSetChanges(\n removedDataSets: VisibleDataSetInfo[],\n addedDataSets: VisibleDataSetInfo[],\n updatedObjects: HashTreeObject[]\n ): VisibleDataSetInfo[] {\n const dataSetsRequiringInitialization: VisibleDataSetInfo[] = [];\n\n // if a visible data set was removed, we need to tell our client that all objects from it are removed\n const removedObjects: HashTreeObject[] = [];\n\n removedDataSets.forEach((ds) => {\n if (this.dataSets[ds.name]?.hashTree) {\n for (let i = 0; i < this.dataSets[ds.name].hashTree.numLeaves; i += 1) {\n removedObjects.push(\n ...this.dataSets[ds.name].hashTree.getLeafData(i).map((elementId) => ({\n htMeta: {\n elementId,\n dataSetNames: [ds.name],\n },\n data: null,\n }))\n );\n }\n\n this.deleteHashTree(ds.name);\n }\n });\n this.visibleDataSets = this.visibleDataSets.filter(\n (vds) => !removedDataSets.some((rds) => rds.name === vds.name)\n );\n updatedObjects.push(...removedObjects);\n\n // now setup the new visible data sets\n for (const ds of addedDataSets) {\n const dataSetInfo = this.dataSets[ds.name];\n\n if (dataSetInfo) {\n if (this.isVisibleDataSet(dataSetInfo.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} Data set \"${ds.name}\" is already visible, skipping`\n );\n\n // eslint-disable-next-line no-continue\n continue;\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} Adding visible data set \"${ds.name}\"`\n );\n\n if (!this.addToVisibleDataSetsList(ds)) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const hashTree = new HashTree([], dataSetInfo.leafCount);\n\n this.dataSets[dataSetInfo.name] = {\n ...dataSetInfo,\n hashTree,\n };\n\n // this call is needed here for the edge case where we receive a message with new visible data sets\n // and there are no objects belonging to these data sets in the message but we already have the info about them in this.dataSets\n this.runSyncAlgorithm(this.dataSets[dataSetInfo.name]);\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} visible data set \"${ds.name}\" added but no info about it in our dataSets structures`\n );\n // todo: add a metric here\n dataSetsRequiringInitialization.push(ds);\n }\n }\n\n return dataSetsRequiringInitialization;\n }\n\n /**\n * Adds entries to the passed in updateObjects array\n * for the changes that result from adding and removing visible data sets.\n *\n * @param {VisibleDataSetInfo[]} addedDataSets - The list of added data sets.\n * @returns {Promise<void>}\n */\n private async initializeNewVisibleDataSets(addedDataSets: VisibleDataSetInfo[]): Promise<void> {\n if (this.state === 'stopped') {\n return;\n }\n const allDataSets = await this.getAllVisibleDataSetsFromLocus();\n\n for (const ds of sortByInitPriority(addedDataSets, DATA_SET_INIT_PRIORITY)) {\n const dataSetInfo = allDataSets.find((d) => d.name === ds.name);\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSets --> ${this.debugId} initializing data set \"${ds.name}\"`\n );\n\n if (!dataSetInfo) {\n LoggerProxy.logger.warn(\n `HashTreeParser#initializeNewVisibleDataSets --> ${this.debugId} missing info about data set \"${ds.name}\" in Locus response from visibleDataSetsUrl`\n );\n } else {\n // eslint-disable-next-line no-await-in-loop\n await this.initializeNewVisibleDataSet(ds, dataSetInfo);\n }\n }\n }\n\n /**\n * Parses incoming hash tree messages, updates the hash trees and returns information about the changes\n *\n * @param {HashTreeMessage} message - The hash tree message containing data sets and objects to be processed\n * @param {string} [debugText] - Optional debug text to include in logs\n * @returns {HashTreeObject[]} list of hash tree objects that were updated as a result of processing the message\n */\n private parseMessage(message: HashTreeMessage, debugText?: string): HashTreeObject[] {\n if (this.state === 'stopped') {\n return [];\n }\n\n const {dataSets, visibleDataSetsUrl} = message;\n\n LoggerProxy.logger.info(\n `HashTreeParser#parseMessage --> ${this.debugId} received message ${debugText || ''}:`,\n message\n );\n if (message.locusStateElements?.length === 0) {\n LoggerProxy.logger.warn(\n `HashTreeParser#parseMessage --> ${this.debugId} got empty locusStateElements!!!`\n );\n // todo: send a metric\n }\n\n // first, update our metadata about the datasets with info from the message\n this.visibleDataSetsUrl = visibleDataSetsUrl;\n dataSets.forEach((dataSet) => this.updateDataSetInfo(dataSet));\n\n const updatedObjects: HashTreeObject[] = [];\n\n // when we detect new visible datasets, it may be that the metadata about them is not\n // available in the message, they will require separate async initialization\n let dataSetsRequiringInitialization: VisibleDataSetInfo[] = [];\n\n // first find out if there are any visible data set changes - they're signalled in Metadata object updates\n const metadataUpdates = (message.locusStateElements || []).filter((object) =>\n isMetadata(object)\n );\n\n if (metadataUpdates.length > 0) {\n const updatedMetadataObjects: HashTreeObject[] = [];\n\n metadataUpdates.forEach((object) => {\n // todo: once Locus supports it, we will use the \"view\" field here instead of dataSetNames\n for (const dataSetName of object.htMeta.dataSetNames) {\n const hashTree = this.dataSets[dataSetName]?.hashTree;\n\n if (hashTree && object.data) {\n if (hashTree.putItem(object.htMeta.elementId)) {\n updatedMetadataObjects.push(object);\n }\n }\n }\n });\n\n updatedObjects.push(...updatedMetadataObjects);\n\n const {changeDetected, removedDataSets, addedDataSets} =\n this.checkForVisibleDataSetChanges(updatedMetadataObjects);\n\n if (changeDetected) {\n dataSetsRequiringInitialization = this.processVisibleDataSetChanges(\n removedDataSets,\n addedDataSets,\n updatedObjects\n );\n }\n }\n\n if (message.locusStateElements && message.locusStateElements.length > 0) {\n // by this point we now have this.dataSets setup for data sets from this message\n // and hash trees created for the new visible data sets,\n // so we can now process all the updates from the message\n dataSets.forEach((dataSet) => {\n if (this.dataSets[dataSet.name]) {\n const {hashTree} = this.dataSets[dataSet.name];\n\n if (hashTree) {\n const locusStateElementsForThisSet = message.locusStateElements.filter((object) =>\n object.htMeta.dataSetNames.includes(dataSet.name)\n );\n\n const appliedChangesList = hashTree.updateItems(\n locusStateElementsForThisSet.map((object) =>\n object.data\n ? {operation: 'update', item: object.htMeta.elementId}\n : {operation: 'remove', item: object.htMeta.elementId}\n )\n );\n\n zip(appliedChangesList, locusStateElementsForThisSet).forEach(\n ([changeApplied, object]) => {\n if (changeApplied) {\n // add to updatedObjects so that our locus DTO will get updated with the new object\n updatedObjects.push(object);\n }\n }\n );\n } else {\n LoggerProxy.logger.info(\n `Locus-info:index#parseMessage --> ${this.debugId} unexpected (not visible) dataSet ${dataSet.name} received in hash tree message`\n );\n }\n }\n\n this.runSyncAlgorithm(dataSet);\n });\n }\n\n if (dataSetsRequiringInitialization.length > 0) {\n // there are some data sets that we need to initialize asynchronously\n this.queueInitForNewVisibleDataSets(dataSetsRequiringInitialization);\n }\n\n if (updatedObjects.length === 0) {\n LoggerProxy.logger.info(\n `HashTreeParser#parseMessage --> ${this.debugId} No objects updated as a result of received message`\n );\n }\n\n return updatedObjects;\n }\n\n /**\n * Handles incoming hash tree messages, updates the hash trees and calls locusInfoUpdateCallback\n *\n * @param {HashTreeMessage} message - The hash tree message containing data sets and objects to be processed\n * @param {string} [debugText] - Optional debug text to include in logs\n * @returns {void}\n */\n handleMessage(message: HashTreeMessage, debugText?: string) {\n if (this.state === 'stopped') {\n return;\n }\n\n if (message.heartbeatIntervalMs) {\n this.heartbeatIntervalMs = message.heartbeatIntervalMs;\n }\n if (this.isEndMessage(message)) {\n LoggerProxy.logger.info(\n `HashTreeParser#handleMessage --> ${this.debugId} received sentinel END MEETING message`\n );\n this.stopAllTimers();\n\n this.callLocusInfoUpdateCallback({updateType: LocusInfoUpdateType.MEETING_ENDED});\n } else if (message.locusStateElements === undefined) {\n this.handleRootHashHeartBeatMessage(message);\n this.resetHeartbeatWatchdogs(message.dataSets);\n } else {\n const updatedObjects = this.parseMessage(message, debugText);\n\n this.resetHeartbeatWatchdogs(message.dataSets);\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.OBJECTS_UPDATED,\n updatedObjects,\n });\n }\n }\n\n /**\n * Calls the updateInfo callback if there are any updates to report\n *\n * @param {Object} updates parsed from a Locus message\n * @returns {void}\n */\n private callLocusInfoUpdateCallback(updates: LocusInfoUpdate) {\n if (this.state === 'stopped') {\n return;\n }\n\n const {updateType} = updates;\n\n if (updateType === LocusInfoUpdateType.OBJECTS_UPDATED && updates.updatedObjects?.length > 0) {\n // Filter out updates for objects that already have a higher version in their datasets,\n // or removals for objects that still exist in any of their datasets\n const filteredUpdates = updates.updatedObjects.filter((object) => {\n const {elementId} = object.htMeta;\n const {type, id, version} = elementId;\n\n // Check all datasets\n for (const dataSetName of Object.keys(this.dataSets)) {\n const dataSet = this.dataSets[dataSetName];\n\n // only visible datasets have hash trees set\n if (dataSet?.hashTree) {\n const existingVersion = dataSet.hashTree.getItemVersion(id, type);\n if (existingVersion !== undefined) {\n if (object.data) {\n // For updates: filter out if any dataset has a higher version\n if (existingVersion > version) {\n LoggerProxy.logger.info(\n `HashTreeParser#callLocusInfoUpdateCallback --> ${this.debugId} Filtering out update for ${type}:${id} v${version} because dataset \"${dataSetName}\" has v${existingVersion}`\n );\n\n return false;\n }\n } else if (existingVersion >= version) {\n // For removals: filter out if the object still exists in any dataset\n LoggerProxy.logger.info(\n `HashTreeParser#callLocusInfoUpdateCallback --> ${this.debugId} Filtering out removal for ${type}:${id} v${version} because dataset \"${dataSetName}\" still has v${existingVersion}`\n );\n\n return false;\n }\n }\n }\n }\n\n return true;\n });\n\n if (filteredUpdates.length > 0) {\n this.locusInfoUpdateCallback({updateType, updatedObjects: filteredUpdates});\n }\n } else if (updateType !== LocusInfoUpdateType.OBJECTS_UPDATED) {\n this.locusInfoUpdateCallback({updateType});\n }\n }\n\n /**\n * Calculates a weighted backoff time that should be used for syncs\n *\n * @param {Object} backoff - The backoff configuration containing maxMs and exponent\n * @returns {number} - A weighted backoff time based on the provided configuration, using algorithm supplied by Locus team\n */\n private getWeightedBackoffTime(backoff: {maxMs: number; exponent: number}): number {\n const {maxMs, exponent} = backoff;\n\n const randomValue = Math.random();\n\n return Math.round(randomValue ** exponent * maxMs);\n }\n\n /**\n * Performs a sync for the given data set.\n *\n * @param {InternalDataSet} dataSet - The data set to sync\n * @param {string} reason - The reason for the sync (used for logging)\n * @param {boolean} [isInitialization] - Whether this is an initialization sync (sends empty leaves data instead of comparing hashes)\n * @returns {Promise<void>}\n */\n private async performSync(\n dataSet: InternalDataSet,\n reason: string,\n isInitialization?: boolean\n ): Promise<void> {\n if (!dataSet.hashTree) {\n return;\n }\n\n const {hashTree} = dataSet;\n const rootHash = hashTree.getRootHash();\n\n try {\n LoggerProxy.logger.info(\n `HashTreeParser#performSync --> ${this.debugId} ${reason}, syncing data set \"${dataSet.name}\"`\n );\n\n let leavesData: Record<number, LeafDataItem[]> = {};\n\n if (!isInitialization) {\n if (dataSet.leafCount !== 1) {\n let receivedHashes;\n\n try {\n // request hashes from sender\n const hashesResult = await this.getHashesFromLocus(dataSet.name, rootHash);\n\n if (!hashesResult) {\n // hashes match, no sync needed\n return;\n }\n\n receivedHashes = hashesResult.hashes;\n\n this.updateDataSetLeafCount(dataSet, hashesResult.dataSet.leafCount);\n } catch (error: any) {\n if (error?.statusCode === 409) {\n // this is a leaf count mismatch, we should do nothing, just wait for another heartbeat message from Locus\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Got 409 when fetching hashes for data set \"${dataSet.name}\": ${error.message}`\n );\n\n return;\n }\n throw error;\n }\n\n // identify mismatched leaves\n const mismatchedLeaveIndexes = hashTree.diffHashes(receivedHashes);\n\n mismatchedLeaveIndexes.forEach((index) => {\n leavesData[index] = hashTree.getLeafData(index);\n });\n } else {\n leavesData = {0: hashTree.getLeafData(0)};\n }\n }\n // request sync for mismatched leaves\n let syncResponse: HashTreeMessage | null = null;\n\n if (isInitialization) {\n syncResponse = await this.sendSyncRequestToLocus(dataSet, {isInitialization: true});\n } else if (Object.keys(leavesData).length > 0) {\n syncResponse = await this.sendSyncRequestToLocus(dataSet, {\n mismatchedLeavesData: leavesData,\n });\n }\n\n // sync API may return nothing (in that case data will arrive via messages)\n // or it may return a response in the same format as messages\n // We still need to restart the sync timer as a safety net in case the messages don't arrive.\n this.runSyncAlgorithm(dataSet);\n\n if (syncResponse) {\n // the format of sync response is the same as messages, so we can reuse the same handler\n this.handleMessage(syncResponse, 'via sync API');\n }\n } catch (error) {\n if (!this.handleSyncErrors(error)) {\n LoggerProxy.logger.warn(\n `HashTreeParser#performSync --> ${this.debugId} error during sync for data set \"${dataSet.name}\":`,\n error\n );\n }\n }\n }\n\n /**\n * Enqueues a sync for the given data set. If the data set is already in the queue, the request is ignored.\n * This ensures that all syncs are executed sequentially and no more than 1 sync runs at a time.\n *\n * @param {string} dataSetName - The name of the data set to sync\n * @param {string} reason - The reason for the sync (used for logging)\n * @param {boolean} [isInitialization=false] - Whether this is an initialization sync (uses empty leaves data instead of hash comparison)\n * @returns {void}\n */\n private enqueueSyncForDataset(\n dataSetName: string,\n reason: string,\n isInitialization = false\n ): void {\n if (this.state === 'stopped') return;\n\n const existingEntry = this.syncQueue.find((entry) => entry.dataSetName === dataSetName);\n\n if (existingEntry) {\n if (isInitialization) {\n existingEntry.isInitialization = true;\n }\n LoggerProxy.logger.info(\n `HashTreeParser#enqueueSyncForDataset --> ${this.debugId} data set \"${dataSetName}\" already in sync queue, skipping`\n );\n\n return;\n }\n\n this.syncQueue.push({dataSetName, reason, isInitialization});\n\n if (!this.isSyncInProgress) {\n this.syncQueueProcessingPromise = this.processSyncQueue();\n }\n }\n\n /**\n * Processes the sync queue sequentially. Only one instance of this method runs at a time.\n *\n * @returns {Promise<void>}\n */\n private async processSyncQueue(): Promise<void> {\n if (this.isSyncInProgress) return;\n\n this.isSyncInProgress = true;\n try {\n while (this.syncQueue.length > 0 && this.state !== 'stopped') {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const {dataSetName, reason, isInitialization} = this.syncQueue.shift()!;\n const dataSet = this.dataSets[dataSetName];\n\n if (!dataSet?.hashTree) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // eslint-disable-next-line no-await-in-loop\n await this.performSync(dataSet, reason, isInitialization);\n }\n } finally {\n this.isSyncInProgress = false;\n }\n }\n\n /**\n * Syncs all data sets that have hash trees, one by one in sequence, using the priority order\n * provided by sortByInitPriority(). Does nothing if the parser is stopped or if a syncAllDatasets\n * call is already in progress.\n *\n * @returns {Promise<void>}\n */\n public async syncAllDatasets(): Promise<void> {\n if (this.state === 'stopped') return;\n if (this.isSyncAllInProgress) return;\n\n this.isSyncAllInProgress = true;\n try {\n const dataSetsWithHashTrees = Object.values(this.dataSets)\n .filter((dataSet) => dataSet?.hashTree)\n .map((dataSet) => ({name: dataSet.name}));\n\n const sorted = sortByInitPriority(dataSetsWithHashTrees, DATA_SET_INIT_PRIORITY);\n\n LoggerProxy.logger.info(\n `HashTreeParser#syncAllDatasets --> ${this.debugId} syncing datasets: ${sorted\n .map((ds) => ds.name)\n .join(', ')}`\n );\n\n for (const ds of sorted) {\n this.enqueueSyncForDataset(ds.name, 'syncAllDatasets');\n }\n\n await this.syncQueueProcessingPromise;\n } finally {\n this.isSyncAllInProgress = false;\n }\n }\n\n /**\n * Runs the sync algorithm for the given data set.\n *\n * @param {DataSet} receivedDataSet - The data set to run the sync algorithm for.\n * @returns {void}\n */\n private runSyncAlgorithm(receivedDataSet: DataSet) {\n const dataSet = this.dataSets[receivedDataSet.name];\n\n if (!dataSet) {\n LoggerProxy.logger.warn(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} No data set found for ${receivedDataSet.name}, skipping sync algorithm`\n );\n\n return;\n }\n\n if (!dataSet.hashTree) {\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} Data set \"${dataSet.name}\" has no hash tree, skipping sync algorithm`\n );\n\n return;\n }\n\n dataSet.hashTree.resize(receivedDataSet.leafCount);\n\n const delay = dataSet.idleMs + this.getWeightedBackoffTime(dataSet.backoff);\n\n if (delay > 0) {\n if (dataSet.timer) {\n clearTimeout(dataSet.timer);\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} setting \"${dataSet.name}\" sync timer for ${delay}`\n );\n\n dataSet.timer = setTimeout(() => {\n dataSet.timer = undefined;\n\n if (!dataSet.hashTree) {\n LoggerProxy.logger.warn(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} Data set \"${dataSet.name}\" no longer has a hash tree, cannot run sync algorithm`\n );\n\n return;\n }\n\n const rootHash = dataSet.hashTree.getRootHash();\n\n if (dataSet.root !== rootHash) {\n this.enqueueSyncForDataset(\n dataSet.name,\n `Root hash mismatch: received=${dataSet.root}, ours=${rootHash}`\n );\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} \"${dataSet.name}\" root hash matching: ${rootHash}, version=${dataSet.version}`\n );\n }\n }, delay);\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} No delay for \"${dataSet.name}\" data set, skipping sync timer reset/setup`\n );\n }\n }\n\n /**\n * Resets the heartbeat watchdog timers for the specified data sets. Each data set has its own\n * watchdog timer that monitors whether heartbeats are being received within the expected interval.\n * If a heartbeat is not received for a specific data set within heartbeatIntervalMs plus\n * a backoff-calculated time, the sync algorithm is initiated for that data set\n *\n * @param {Array<DataSet>} receivedDataSets - The data sets from the received message for which watchdog timers should be reset\n * @returns {void}\n */\n private resetHeartbeatWatchdogs(receivedDataSets: Array<DataSet>): void {\n if (!this.heartbeatIntervalMs) {\n return;\n }\n\n for (const receivedDataSet of receivedDataSets) {\n const dataSet = this.dataSets[receivedDataSet.name];\n\n if (!dataSet?.hashTree) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (dataSet.heartbeatWatchdogTimer) {\n clearTimeout(dataSet.heartbeatWatchdogTimer);\n dataSet.heartbeatWatchdogTimer = undefined;\n }\n\n const backoffTime = this.getWeightedBackoffTime(dataSet.backoff);\n const delay = this.heartbeatIntervalMs + backoffTime;\n\n dataSet.heartbeatWatchdogTimer = setTimeout(() => {\n dataSet.heartbeatWatchdogTimer = undefined;\n\n LoggerProxy.logger.warn(\n `HashTreeParser#resetHeartbeatWatchdogs --> ${this.debugId} Heartbeat watchdog fired for data set \"${dataSet.name}\" - no heartbeat received within expected interval, initiating sync`\n );\n\n this.enqueueSyncForDataset(dataSet.name, `heartbeat watchdog expired`);\n this.resetHeartbeatWatchdogs([dataSet]);\n }, delay);\n }\n }\n\n /**\n * Stops all timers for the data sets to prevent any further sync attempts.\n * @returns {void}\n */\n private stopAllTimers() {\n Object.values(this.dataSets).forEach((dataSet) => {\n if (dataSet.timer) {\n clearTimeout(dataSet.timer);\n dataSet.timer = undefined;\n }\n if (dataSet.heartbeatWatchdogTimer) {\n clearTimeout(dataSet.heartbeatWatchdogTimer);\n dataSet.heartbeatWatchdogTimer = undefined;\n }\n });\n }\n\n /**\n * Stops the HashTreeParser, preventing it from processing any further messages and clearing all timers.\n * It also clears all the hash trees, so if the parser is resumed later, it will need to do a sync\n * to be up-to-date.\n * @returns {void}\n */\n public stop() {\n LoggerProxy.logger.info(\n `HashTreeParser#stop --> ${this.debugId} Stopping HashTreeParser, clearing timers and hash trees`\n );\n this.stopAllTimers();\n this.syncQueue = [];\n Object.values(this.dataSets).forEach((dataSet) => {\n dataSet.hashTree = undefined;\n });\n this.visibleDataSets = [];\n this.state = 'stopped';\n }\n\n /**\n * Cleans up the HashTreeParser, stopping all timers and clearing all internal state.\n * After calling this, the parser should not be used anymore.\n * @returns {void}\n */\n public cleanUp() {\n this.stop();\n this.dataSets = {};\n }\n\n /**\n * Resumes the HashTreeParser that was previously stopped, using a hash tree message.\n * @param {HashTreeMessage} message - The message to resume with, it must contain metadata with visible data sets info\n * @returns {void}\n */\n public resumeFromMessage(message: HashTreeMessage) {\n // check that message contains metadata with visible data sets - this is essential to be able to resume\n const metadataObject = message.locusStateElements?.find((el) => isMetadata(el));\n\n if (!metadataObject?.data?.visibleDataSets) {\n LoggerProxy.logger.warn(\n `HashTreeParser#resumeFromMessage --> ${this.debugId} Cannot resume HashTreeParser because the message is missing metadata with visible data sets info`\n );\n\n return;\n }\n this.setVisibleDataSets(\n metadataObject.data.visibleDataSets as VisibleDataSetInfo[],\n message.dataSets\n );\n\n this.dataSets = {};\n\n for (const dataSet of message.dataSets) {\n const {name, leafCount} = dataSet;\n\n this.dataSets[name] = {\n ...dataSet,\n hashTree: this.isVisibleDataSet(name) ? new HashTree([], leafCount) : undefined,\n };\n }\n LoggerProxy.logger.info(\n `HashTreeParser#resumeFromMessage --> ${\n this.debugId\n } Resuming HashTreeParser with data sets: ${Object.keys(this.dataSets).join(\n ', '\n )}, visible data sets: ${this.visibleDataSets.map((ds) => ds.name).join(', ')}`\n );\n this.state = 'active';\n\n this.handleMessage(message, 'on resume');\n }\n\n /**\n * Resumes the HashTreeParser that was previously stopped, using a Locus API response.\n * Unlike resumeFromMessage(), this does not require metadata/dataSets in the input,\n * as it fetches all necessary information from Locus via initializeFromGetLociResponse.\n * @param {LocusDTO} locus - locus object from an API response\n * @returns {Promise}\n */\n public async resumeFromApiResponse(locus: LocusDTO) {\n this.state = 'active';\n this.dataSets = {};\n\n LoggerProxy.logger.info(\n `HashTreeParser#resumeFromApiResponse --> ${this.debugId} Resuming HashTreeParser from API response`\n );\n\n await this.initializeFromGetLociResponse(locus);\n }\n\n private checkForSentinelHttpResponse(error: any, dataSetName?: string) {\n // 404 for any dataset means the locus is no longer available at this URL - could be replaced or ended\n // if a dataset is just not visible, we would get a 400\n if (error.statusCode === 404) {\n LoggerProxy.logger.info(\n `HashTreeParser#checkForSentinelHttpResponse --> ${this.debugId} Received 404 for data set \"${dataSetName}\", locus not found`\n );\n this.stopAllTimers();\n\n throw new LocusNotFoundError();\n }\n\n const isValidDataSetForSentinel =\n dataSetName === undefined ||\n PossibleSentinelMessageDataSetNames.includes(dataSetName.toLowerCase());\n\n if (\n error.statusCode === 409 &&\n error.body?.errorCode === LocusErrorCodes.LOCUS_INACTIVE &&\n isValidDataSetForSentinel\n ) {\n LoggerProxy.logger.info(\n `HashTreeParser#checkForSentinelHttpResponse --> ${this.debugId} Received ${error.statusCode}/${error.body?.errorCode} for data set \"${dataSetName}\", indicating that the meeting has ended`\n );\n this.stopAllTimers();\n\n throw new MeetingEndedError();\n }\n }\n\n /**\n * Gets the current hashes from the locus for a specific data set.\n * @param {string} dataSetName\n * @param {string} currentRootHash\n * @returns {Object|null} An object containing the hashes and leaf count, or null if the hashes match and no sync is needed\n */\n private getHashesFromLocus(dataSetName: string, currentRootHash: string) {\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Requesting hashes for data set \"${dataSetName}\"`\n );\n\n const dataSet = this.dataSets[dataSetName];\n\n const url = `${dataSet.url}/hashtree`;\n\n return this.webexRequest({\n method: HTTP_VERBS.GET,\n uri: url,\n qs: {\n rootHash: currentRootHash,\n },\n })\n .then((response) => {\n if (!response.body || isEmpty(response.body)) {\n // 204 with empty body means our hashes match Locus, no sync needed\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Got ${response.statusCode} with empty body for data set \"${dataSetName}\", hashes match - no sync needed`\n );\n\n return null;\n }\n\n const hashes = response.body?.hashes as string[] | undefined;\n const dataSetFromResponse = response.body?.dataSet;\n\n if (!hashes || !Array.isArray(hashes)) {\n LoggerProxy.logger.warn(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Locus returned invalid hashes, response body=`,\n response.body\n );\n throw new Error(`Locus returned invalid hashes: ${hashes}`);\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${\n this.debugId\n } Received hashes for data set \"${dataSetName}\": ${JSON.stringify(hashes)}`\n );\n\n return {\n hashes,\n dataSet: dataSetFromResponse as DataSet,\n };\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Error ${error.statusCode} fetching hashes for data set \"${dataSetName}\":`,\n error\n );\n this.checkForSentinelHttpResponse(error, dataSet.name);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {\n debugId: this.debugId,\n dataSetName,\n request: 'GET /hashtree',\n statusCode: error.statusCode,\n reason: error.message,\n });\n\n throw error;\n });\n }\n\n /**\n * Sends a sync request to Locus for the specified data set.\n *\n * @param {InternalDataSet} dataSet The data set to sync.\n * @param {Object} options Either `{ isInitialization: true }` for init syncs (uses leafCount=1 with empty leaf data) or `{ mismatchedLeavesData }` for normal syncs.\n * @returns {Promise<HashTreeMessage|null>}\n */\n private sendSyncRequestToLocus(\n dataSet: InternalDataSet,\n options: {isInitialization: true} | {mismatchedLeavesData: Record<number, LeafDataItem[]>}\n ): Promise<HashTreeMessage | null> {\n LoggerProxy.logger.info(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Sending sync request for data set \"${dataSet.name}\"`\n );\n\n const isInitialization = 'isInitialization' in options;\n\n const url = `${dataSet.url}/sync`;\n const body: {\n leafCount: number;\n leafDataEntries: {leafIndex: number; elementIds: LeafDataItem[]}[];\n } = {\n leafCount: isInitialization ? 1 : dataSet.leafCount,\n leafDataEntries: [],\n };\n\n if (isInitialization) {\n // initialization sync: Locus requires leafCount=1 with a single empty leaf\n body.leafDataEntries.push({leafIndex: 0, elementIds: []});\n } else {\n const {mismatchedLeavesData} = options;\n\n Object.keys(mismatchedLeavesData).forEach((index) => {\n const leafIndex = parseInt(index, 10);\n\n body.leafDataEntries.push({\n leafIndex,\n elementIds: mismatchedLeavesData[leafIndex],\n });\n });\n }\n\n const ourCurrentRootHash = dataSet.hashTree ? dataSet.hashTree.getRootHash() : EMPTY_HASH;\n\n return this.webexRequest({\n method: HTTP_VERBS.POST,\n uri: url,\n qs: {\n rootHash: ourCurrentRootHash,\n },\n body,\n })\n .then((resp) => {\n LoggerProxy.logger.info(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Sync request succeeded for \"${dataSet.name}\"`\n );\n\n if (!resp.body || isEmpty(resp.body)) {\n LoggerProxy.logger.info(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Got ${resp.statusCode} with empty body for sync request for data set \"${dataSet.name}\", data should arrive via messages`\n );\n\n return null;\n }\n\n return resp.body as HashTreeMessage;\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Error ${error.statusCode} sending sync request for data set \"${dataSet.name}\":`,\n error\n );\n this.checkForSentinelHttpResponse(error, dataSet.name);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {\n debugId: this.debugId,\n dataSetName: dataSet.name,\n request: 'POST /sync',\n statusCode: error.statusCode,\n reason: error.message,\n });\n\n throw error;\n });\n }\n}\n\nexport default HashTreeParser;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_lodash","require","_hashTree","_interopRequireDefault","_loggerProxy","_metrics","_constants","_constants2","_constants3","_types","_types2","_utils","ownKeys","e","r","t","_Object$keys4","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray2","_unsupportedIterableToArray","_n","F","s","n","done","value","f","TypeError","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","Boolean","prototype","valueOf","LocusInfoUpdateType","exports","OBJECTS_UPDATED","MEETING_ENDED","LOCUS_NOT_FOUND","MeetingEndedError","_Error","_classCallCheck2","_inherits2","_createClass2","_wrapNativeSuper2","Error","LocusNotFoundError","_Error2","MetadataDataSetName","DataSetNames","SELF","PossibleSentinelMessageDataSetNames","MAIN","UNJOINED","HashTreeParser","options","_locus$links","_locus$links$resource","_locus$links$resource2","_options$metadata","_options$metadata2","_options$metadata2$vi","_promise","resolve","_options$initialLocus","initialLocus","dataSets","locus","debugId","webexRequest","locusInfoUpdateCallback","excludedDataSets","visibleDataSetsUrl","links","resources","visibleDataSets","url","setVisibleDataSets","metadata","state","LoggerProxy","logger","warn","concat","leafData","analyzeLocusHtMeta","analyzeMetadata","info","_stringify","map","ds","vds","_iterator","_step","dataSet","leafCount","hashTree","isVisibleDataSet","HashTree","undefined","err","key","_this","cloneDeep","isExcludedDataSet","some","dataSetName","addToVisibleDataSetsList","dataSetInfo","_initializeNewVisibleDataSet","_asyncToGenerator2","_regenerator","mark","_callee","visibleDataSetInfo","wrap","_context","prev","abrupt","enqueueSyncForDataset","syncQueueProcessingPromise","stop","initializeNewVisibleDataSet","_x","_x2","getAllVisibleDataSetsFromLocus","_this2","method","HTTP_VERBS","GET","uri","then","response","body","catch","error","checkForSentinelHttpResponse","_initializeFromMessage","_callee2","message","_context2","sent","initializeDataSets","initializeFromMessage","_x3","_initializeFromGetLociResponse","_callee3","_locus$links2","_locus$links2$resourc","_locus$links2$resourc2","_context3","initializeFromGetLociResponse","_x4","_initializeDataSets","_callee4","debugText","_iterator2","_step2","_t","_context4","sortByInitPriority","DATA_SET_INIT_PRIORITY","finish","_x5","_x6","_ref","_ref$copyData","copyData","leafInfo","findAndStoreMetaData","currentLocusPart","currentLocusPartName","_typeof2","htMeta","dataSetNames","_currentLocusPart$htM","elementId","type","id","version","newLeafInfo","toLowerCase","ObjectType","control","data","deleteNestedObjectsWithHtMeta","_iterator3","_step3","_isArray","_iterator4","entries","_step4","_step4$value","_slicedToArray2","index","item","_i","_Object$keys","_keys","hasOwnProperty","_htMeta$dataSetNames","_metadata$htMeta$elem","join","isEndMessage","_this3","root","EMPTY_HASH","includes","handleRootHashHeartBeatMessage","_this4","updateDataSetInfo","runSyncAlgorithm","handleSyncErrors","callLocusInfoUpdateCallback","updateType","queueInitForNewVisibleDataSets","dataSetsRequiringInitialization","_this5","queueMicrotask","initializeNewVisibleDataSets","handleMetadataUpdate","updatedObjects","_this$dataSets$Metada","metadataUpdated","putItem","metadataObject","_this$checkForVisible","checkForVisibleDataSetChanges","changeDetected","removedDataSets","addedDataSets","processVisibleDataSetChanges","handleLocusUpdate","update","_this6","_iterator5","_step5","appliedChangesList","putItems","leaf","zip","_ref2","_ref3","changeApplied","receivedDataSet","idleMs","backoff","maxMs","exponent","updateDataSetLeafCount","newLeafCount","_dataSet$hashTree","resize","_this7","object","_object$data","isMetadata","newVisibleDataSets","nvs","every","deleteHashTree","timer","clearTimeout","heartbeatWatchdogTimer","_this8","removedObjects","_this8$dataSets$ds$na","i","numLeaves","_toConsumableArray2","getLeafData","rds","_iterator6","_step6","_initializeNewVisibleDataSets","_callee5","_this9","allDataSets","_iterator7","_step7","_loop","_t2","_context6","_context5","find","d","delegateYield","_x7","parseMessage","_message$dataSets","_message$locusStateEl","_message$locusStateEl2","_this0","_ref4","locusStateElements","el","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","HASH_TREE_EMPTY_LOCUS_STATE_ELEMENTS","metadataUpdates","updatedMetadataObjects","_iterator8","_step8","_this0$dataSets$dataS","_this$checkForVisible2","locusStateElementsForThisSet","updateItems","operation","_ref5","_ref6","handleMessage","heartbeatIntervalMs","stopAllTimers","resetHeartbeatWatchdogs","updates","_updates$updatedObjec","_this1","filteredUpdates","_i2","_Object$keys3","existingVersion","getItemVersion","getWeightedBackoffTime","randomValue","Math","random","round","pow","_performSync","_callee6","reason","isInitialization","rootHash","leavesData","receivedHashes","hashesResult","mismatchedLeaveIndexes","syncResponse","_t3","_t4","_context7","getRootHash","getHashesFromLocus","hashes","statusCode","diffHashes","sendSyncRequestToLocus","mismatchedLeavesData","performSync","_x8","_x9","_x0","existingEntry","syncQueue","entry","isSyncInProgress","processSyncQueue","_processSyncQueue","_callee7","_ref7","_context8","shift","_syncAllDatasets","_callee8","dataSetsWithHashTrees","sorted","_iterator9","_step9","_context9","isSyncAllInProgress","_values","syncAllDatasets","_this10","delay","setTimeout","receivedDataSets","_this11","_iterator0","_step0","_loop2","backoffTime","HASH_TREE_HEARTBEAT_WATCHDOG_EXPIRED","cleanUp","resumeFromMessage","_message$locusStateEl3","_metadataObject$data","_iterator1","_step1","_resumeFromApiResponse","_callee9","_context0","resumeFromApiResponse","_x1","_error$body","isValidDataSetForSentinel","errorCode","LocusErrorCodes","LOCUS_INACTIVE","_error$body2","currentRootHash","_this12","qs","_response$body","_response$body2","isEmpty","dataSetFromResponse","HASH_TREE_SYNC_FAILURE","request","_this13","leafDataEntries","leafIndex","elementIds","_parseInt2","ourCurrentRootHash","POST","resp","_default"],"sources":["hashTreeParser.ts"],"sourcesContent":["import {cloneDeep, isEmpty, zip} from 'lodash';\nimport HashTree, {LeafDataItem} from './hashTree';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport {Enum, HTTP_VERBS} from '../constants';\nimport {DataSetNames, DATA_SET_INIT_PRIORITY, EMPTY_HASH} from './constants';\nimport {ObjectType, HtMeta, HashTreeObject} from './types';\nimport {LocusDTO, LocusErrorCodes} from '../locus-info/types';\nimport {deleteNestedObjectsWithHtMeta, isMetadata, sortByInitPriority} from './utils';\n\nexport interface DataSet {\n url: string;\n root: string;\n version: number;\n leafCount: number;\n name: string;\n idleMs: number;\n backoff: {\n maxMs: number;\n exponent: number;\n };\n}\n\nexport interface RootHashMessage {\n dataSets: Array<DataSet>;\n}\nexport interface HashTreeMessage {\n dataSets: Array<DataSet>;\n visibleDataSetsUrl: string; // url from which we can get more info about all data sets - now it seems to be visibleDataSetsUrl\n locusStateElements?: Array<HashTreeObject>;\n locusSessionId?: string;\n locusUrl: string;\n heartbeatIntervalMs?: number;\n}\n\nexport interface VisibleDataSetInfo {\n name: string;\n url: string;\n dataChannelUrl?: string;\n}\n\nexport interface Metadata {\n htMeta: HtMeta;\n visibleDataSets: VisibleDataSetInfo[];\n}\n\ninterface InternalDataSet extends DataSet {\n hashTree?: HashTree; // set only for visible data sets\n timer?: ReturnType<typeof setTimeout>;\n heartbeatWatchdogTimer?: ReturnType<typeof setTimeout>;\n}\n\ntype WebexRequestMethod = (options: Record<string, any>) => Promise<any>;\n\nexport const LocusInfoUpdateType = {\n OBJECTS_UPDATED: 'OBJECTS_UPDATED',\n MEETING_ENDED: 'MEETING_ENDED',\n LOCUS_NOT_FOUND: 'LOCUS_NOT_FOUND',\n} as const;\n\nexport type LocusInfoUpdateType = Enum<typeof LocusInfoUpdateType>;\n\ninterface LocusUpdatePayloads {\n [LocusInfoUpdateType.OBJECTS_UPDATED]: {updatedObjects: HashTreeObject[]};\n [LocusInfoUpdateType.MEETING_ENDED]: unknown; // No extra data\n [LocusInfoUpdateType.LOCUS_NOT_FOUND]: unknown; // No extra data\n}\n\nexport type LocusInfoUpdate = {\n [K in keyof LocusUpdatePayloads]: {\n updateType: K;\n } & LocusUpdatePayloads[K];\n}[keyof LocusUpdatePayloads];\n\nexport type LocusInfoUpdateCallback = (update: LocusInfoUpdate) => void;\n\ninterface LeafInfo {\n type: ObjectType;\n id: number;\n version: number;\n data?: any;\n}\n\n/**\n * This error is thrown if we receive information that the meeting has ended while we're processing some hash messages.\n * It's handled internally by HashTreeParser and results in MEETING_ENDED being sent up.\n */\nexport class MeetingEndedError extends Error {}\n\n/**\n * This error is thrown when a 404 is received from Locus hash tree endpoints, indicating that the locus URL\n * is no longer valid (e.g. participant moved to a breakout room, or meeting ended).\n * It's handled internally by HashTreeParser and results in LOCUS_NOT_FOUND being sent up.\n */\nexport class LocusNotFoundError extends Error {}\n\n/* Currently Locus always sends Metadata objects only in the \"self\" dataset.\n * If this ever changes, update all the code that relies on this constant.\n */\nconst MetadataDataSetName = DataSetNames.SELF;\n\nconst PossibleSentinelMessageDataSetNames = [\n DataSetNames.MAIN,\n DataSetNames.SELF,\n DataSetNames.UNJOINED,\n];\n\n/**\n * Parses hash tree eventing locus data\n */\nclass HashTreeParser {\n dataSets: Record<string, InternalDataSet> = {};\n visibleDataSetsUrl: string; // url from which we can get info about all data sets\n webexRequest: WebexRequestMethod;\n locusInfoUpdateCallback: LocusInfoUpdateCallback;\n visibleDataSets: VisibleDataSetInfo[];\n debugId: string;\n heartbeatIntervalMs?: number;\n private excludedDataSets: string[];\n state: 'active' | 'stopped';\n private syncQueue: Array<{dataSetName: string; reason: string; isInitialization?: boolean}> = [];\n private isSyncInProgress = false;\n private isSyncAllInProgress = false;\n private syncQueueProcessingPromise: Promise<void> = Promise.resolve();\n\n /**\n * Constructor for HashTreeParser\n * @param {Object} options\n * @param {Object} options.initialLocus The initial locus data containing the hash tree information\n */\n constructor(options: {\n initialLocus: {\n dataSets: Array<DataSet>;\n locus: any;\n };\n metadata: Metadata | null;\n webexRequest: WebexRequestMethod;\n locusInfoUpdateCallback: LocusInfoUpdateCallback;\n debugId: string;\n excludedDataSets?: string[];\n }) {\n const {dataSets, locus} = options.initialLocus; // extract dataSets from initialLocus\n\n this.debugId = options.debugId;\n this.webexRequest = options.webexRequest;\n this.locusInfoUpdateCallback = options.locusInfoUpdateCallback;\n this.excludedDataSets = options.excludedDataSets || [];\n this.visibleDataSetsUrl = locus?.links?.resources?.visibleDataSets?.url;\n this.setVisibleDataSets(options.metadata?.visibleDataSets || [], dataSets);\n\n this.state = 'active';\n\n if (options.metadata?.visibleDataSets?.length === 0) {\n LoggerProxy.logger.warn(\n `HashTreeParser#constructor --> ${this.debugId} No visibleDataSets found in Metadata`\n );\n }\n // object mapping dataset names to arrays of leaf data\n const leafData = this.analyzeLocusHtMeta(locus);\n\n if (options.metadata) {\n // add also the metadata that's outside of locus object itself\n this.analyzeMetadata(leafData, options.metadata);\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#constructor --> ${\n this.debugId\n } creating HashTreeParser for datasets: ${JSON.stringify(\n dataSets.map((ds) => ds.name)\n )} with visible datasets: ${JSON.stringify(this.visibleDataSets.map((vds) => vds.name))}`\n );\n\n for (const dataSet of dataSets) {\n const {name, leafCount} = dataSet;\n\n this.dataSets[name] = {\n ...dataSet,\n hashTree: this.isVisibleDataSet(name)\n ? new HashTree(leafData[name] || [], leafCount)\n : undefined,\n };\n }\n }\n\n /**\n * Sets the visible data sets list for the HashTreeParser. This method should be called only at the start, to initialize\n * the visible data sets, before any message processsing, so for example from the constructor or when resuming the parser.\n *\n * @param {Array<VisibleDataSetInfo>} visibleDataSets - The visible data sets to set\n * @param {Array<DataSet>} dataSets - The \"dataSets\" list from Locus (yes, Locus sends visibleDataSets and dataSets as separate lists and they can differ)\n * @returns {void}\n */\n private setVisibleDataSets(visibleDataSets: VisibleDataSetInfo[], dataSets: Array<DataSet>) {\n this.visibleDataSets = cloneDeep(visibleDataSets).filter(\n (vds) =>\n // exclude data sets we will never care about\n !this.isExcludedDataSet(vds.name) &&\n // and make sure that visibleDataSets list is consistent with dataSets list\n dataSets.some((ds) => ds.name === vds.name)\n );\n }\n\n /**\n * Checks if the given data set name is in the list of visible data sets\n * @param {string} dataSetName data set name to check\n * @returns {Boolean} True if the data set is visible, false otherwise\n */\n private isVisibleDataSet(dataSetName: string): boolean {\n return this.visibleDataSets.some((vds) => vds.name === dataSetName);\n }\n\n /**\n * Checks if the given data set name is in the excluded list\n * @param {string} dataSetName data set name to check\n * @returns {boolean} True if the data set is excluded, false otherwise\n */\n private isExcludedDataSet(dataSetName: string): boolean {\n return this.excludedDataSets.some((name) => name === dataSetName);\n }\n\n /**\n * Adds a data set to the visible data sets list, unless it is in the excluded list.\n * @param {VisibleDataSetInfo} dataSetInfo data set info to add\n * @returns {boolean} True if the data set was added, false if it was excluded\n */\n private addToVisibleDataSetsList(dataSetInfo: VisibleDataSetInfo): boolean {\n if (this.isExcludedDataSet(dataSetInfo.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#addToVisibleDataSetsList --> ${this.debugId} Data set \"${dataSetInfo.name}\" is in the excluded list, ignoring`\n );\n\n return false;\n }\n\n this.visibleDataSets.push(dataSetInfo);\n\n return true;\n }\n\n /**\n * Initializes a new visible data set by creating a hash tree for it, adding it to all the internal structures,\n * and sending an initial sync request to Locus with empty leaf data - that will trigger Locus to gives us all the data\n * from that dataset (in the response or via messages).\n *\n * @param {VisibleDataSetInfo} visibleDataSetInfo Information about the new visible data set\n * @param {DataSet} dataSetInfo The new data set to be added\n * @returns {Promise}\n */\n private async initializeNewVisibleDataSet(\n visibleDataSetInfo: VisibleDataSetInfo,\n dataSetInfo: DataSet\n ): Promise<void> {\n if (this.isVisibleDataSet(dataSetInfo.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSet --> ${this.debugId} Data set \"${dataSetInfo.name}\" already exists, skipping init`\n );\n\n return;\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSet --> ${this.debugId} Adding visible data set \"${dataSetInfo.name}\"`\n );\n\n if (!this.addToVisibleDataSetsList(visibleDataSetInfo)) {\n return;\n }\n\n const hashTree = new HashTree([], dataSetInfo.leafCount);\n\n this.dataSets[dataSetInfo.name] = {\n ...dataSetInfo,\n hashTree,\n };\n\n this.enqueueSyncForDataset(dataSetInfo.name, 'new visible data set initialization', true);\n await this.syncQueueProcessingPromise;\n }\n\n /**\n * Queries Locus for all up-to-date information about all visible data sets\n *\n * @returns {Promise}\n */\n private getAllVisibleDataSetsFromLocus() {\n if (!this.visibleDataSetsUrl) {\n LoggerProxy.logger.warn(\n `HashTreeParser#getAllVisibleDataSetsFromLocus --> ${this.debugId} No visibleDataSetsUrl, cannot get data sets information`\n );\n\n return Promise.resolve([]);\n }\n\n return this.webexRequest({\n method: HTTP_VERBS.GET,\n uri: this.visibleDataSetsUrl,\n })\n .then((response) => {\n return response.body.dataSets as Array<DataSet>;\n })\n .catch((error) => {\n this.checkForSentinelHttpResponse(error);\n\n throw error;\n });\n }\n\n /**\n * Initializes the hash tree parser from a message received from Locus.\n *\n * @param {HashTreeMessage} message - initial hash tree message received from Locus\n * @returns {Promise}\n */\n async initializeFromMessage(message: HashTreeMessage) {\n this.visibleDataSetsUrl = message.visibleDataSetsUrl;\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeFromMessage --> ${this.debugId} visibleDataSetsUrl=${this.visibleDataSetsUrl}`\n );\n const visibleDataSets = await this.getAllVisibleDataSetsFromLocus();\n\n await this.initializeDataSets(visibleDataSets, 'initialization from message');\n }\n\n /**\n * Initializes the hash tree parser from GET /loci API response by fetching all data sets metadata\n * first and then doing an initialization sync on each data set\n *\n * This function requires that this.visibleDataSets have been already populated correctly by the constructor.\n *\n * @param {LocusDTO} locus - locus object received from GET /loci\n * @returns {Promise}\n */\n async initializeFromGetLociResponse(locus: LocusDTO) {\n if (!locus?.links?.resources?.visibleDataSets?.url) {\n LoggerProxy.logger.warn(\n `HashTreeParser#initializeFromGetLociResponse --> ${this.debugId} missing visibleDataSets url in GET Loci response, cannot initialize hash trees`\n );\n\n return;\n }\n this.visibleDataSetsUrl = locus.links.resources.visibleDataSets.url;\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeFromGetLociResponse --> ${this.debugId} visibleDataSets url: ${this.visibleDataSetsUrl}`\n );\n\n const visibleDataSets = await this.getAllVisibleDataSetsFromLocus();\n\n await this.initializeDataSets(visibleDataSets, 'initialization from GET /loci response');\n }\n\n /**\n * Initializes data sets by doing an initialization sync on each visible data set that doesn't have a hash tree yet.\n *\n * @param {DataSet[]} visibleDataSets Array of visible DataSet objects to initialize\n * @param {string} debugText Text to include in logs for debugging purposes\n * @returns {Promise}\n */\n private async initializeDataSets(visibleDataSets: Array<DataSet>, debugText: string) {\n if (this.state === 'stopped') {\n return;\n }\n\n for (const dataSet of sortByInitPriority(visibleDataSets, DATA_SET_INIT_PRIORITY)) {\n const {name, leafCount, url} = dataSet;\n\n if (!this.dataSets[name]) {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeDataSets --> ${this.debugId} initializing dataset \"${name}\" (${debugText})`\n );\n\n this.dataSets[name] = {\n ...dataSet,\n };\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeDataSets --> ${this.debugId} dataset \"${name}\" already exists (${debugText})`\n );\n }\n\n if (!this.isVisibleDataSet(name)) {\n if (\n !this.addToVisibleDataSetsList({\n name,\n url,\n })\n ) {\n // dataset is excluded, skip it\n // eslint-disable-next-line no-continue\n continue;\n }\n }\n\n if (!this.dataSets[name].hashTree) {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeDataSets --> ${this.debugId} creating hash tree for visible dataset \"${name}\" (${debugText})`\n );\n this.dataSets[name].hashTree = new HashTree([], leafCount);\n\n this.enqueueSyncForDataset(name, `initialization sync for ${debugText}`, true);\n }\n }\n\n // wait for all enqueued initialization syncs to complete\n await this.syncQueueProcessingPromise;\n }\n\n /**\n * Each dataset exists at a different place in the dto\n * iterate recursively over the locus and if it has a htMeta key,\n * create an object with the type, id and version and add it to the appropriate leafData array\n *\n * @param {any} locus - The current part of the locus being processed\n * @param {Object} [options]\n * @param {boolean} [options.copyData=false] - Whether to copy the data for each leaf into returned result\n * @returns {any} - An object mapping dataset names to arrays of leaf data\n */\n private analyzeLocusHtMeta(locus: any, options?: {copyData?: boolean}) {\n const {copyData = false} = options || {};\n // object mapping dataset names to arrays of leaf data\n const leafInfo: Record<string, Array<LeafInfo>> = {};\n\n const findAndStoreMetaData = (currentLocusPart: any, currentLocusPartName: string) => {\n if (typeof currentLocusPart !== 'object' || currentLocusPart === null) {\n return;\n }\n\n if (currentLocusPart.htMeta && currentLocusPart.htMeta.dataSetNames) {\n const {type, id, version} = currentLocusPart.htMeta.elementId;\n const {dataSetNames} = currentLocusPart.htMeta;\n const newLeafInfo: LeafInfo = {\n type,\n id,\n version,\n };\n\n if (copyData) {\n if ((type as string).toLowerCase() === ObjectType.control) {\n // control entries require special handling, because they are signalled by Locus\n // differently when coming in messages vs API responses\n newLeafInfo.data = {\n [currentLocusPartName]: cloneDeep(currentLocusPart),\n };\n } else {\n newLeafInfo.data = cloneDeep(currentLocusPart);\n\n // remove any nested other objects that have their own htMeta\n deleteNestedObjectsWithHtMeta(newLeafInfo.data);\n }\n }\n\n for (const dataSetName of dataSetNames) {\n if (!leafInfo[dataSetName]) {\n leafInfo[dataSetName] = [];\n }\n leafInfo[dataSetName].push(newLeafInfo);\n }\n }\n\n if (Array.isArray(currentLocusPart)) {\n for (const [index, item] of currentLocusPart.entries()) {\n findAndStoreMetaData(item, index.toString());\n }\n } else {\n for (const key of Object.keys(currentLocusPart)) {\n if (Object.prototype.hasOwnProperty.call(currentLocusPart, key)) {\n findAndStoreMetaData(currentLocusPart[key], key);\n }\n }\n }\n };\n\n findAndStoreMetaData(locus, 'locus');\n\n return leafInfo;\n }\n\n /**\n * Analyzes the Metadata object that is sent outside of Locus object, and appends its data to passed in leafInfo\n * structure.\n *\n * @param {Record<string, LeafInfo[]>} leafInfo the structure to which the Metadata info will be appended\n * @param {Metadata} metadata Metadata object\n * @returns {void}\n */\n private analyzeMetadata(leafInfo: Record<string, LeafInfo[]>, metadata: Metadata) {\n const {htMeta} = metadata;\n\n if (\n htMeta?.dataSetNames?.length === 1 &&\n htMeta.dataSetNames[0].toLowerCase() === MetadataDataSetName\n ) {\n const {type, id, version} = metadata.htMeta.elementId;\n\n const dataSetName = htMeta.dataSetNames[0];\n\n if (!leafInfo[dataSetName]) {\n leafInfo[dataSetName] = [];\n }\n\n leafInfo[dataSetName].push({\n type,\n id,\n version,\n });\n } else {\n throw new Error(\n `${this.debugId} Metadata htMeta has unexpected dataSetNames: ${\n htMeta && htMeta.dataSetNames.join(',')\n }`\n );\n }\n }\n\n /**\n * Checks if the provided hash tree message indicates the end of the meeting and that there won't be any more updates.\n *\n * @param {HashTreeMessage} message - The hash tree message to check\n * @returns {boolean} - Returns true if the message indicates the end of the meeting, false otherwise\n */\n private isEndMessage(message: HashTreeMessage) {\n return message.dataSets.some((dataSet) => {\n if (\n dataSet.leafCount === 1 &&\n dataSet.root === EMPTY_HASH &&\n (!this.dataSets[dataSet.name] || this.dataSets[dataSet.name].version < dataSet.version) &&\n PossibleSentinelMessageDataSetNames.includes(dataSet.name.toLowerCase())\n ) {\n // this is a special way for Locus to indicate that this meeting has ended\n return true;\n }\n\n return false;\n });\n }\n\n /**\n * Handles the root hash heartbeat message\n *\n * @param {RootHashMessage} message - The root hash heartbeat message\n * @returns {void}\n */\n private handleRootHashHeartBeatMessage(message: RootHashMessage): void {\n const {dataSets} = message;\n\n dataSets.forEach((dataSet) => {\n this.updateDataSetInfo(dataSet);\n this.runSyncAlgorithm(dataSet);\n });\n }\n\n /**\n * Handles known errors that can happen during syncs\n *\n * @param {any} error - The error to handle\n * @returns {boolean} true if the error was recognized and handled, false otherwise\n */\n private handleSyncErrors(error: any) {\n if (error instanceof MeetingEndedError) {\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.MEETING_ENDED,\n });\n\n return true;\n }\n if (error instanceof LocusNotFoundError) {\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.LOCUS_NOT_FOUND,\n });\n this.stop();\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Asynchronously initializes new visible data sets\n *\n * @param {VisibleDataSetInfo[]} dataSetsRequiringInitialization list of datasets to initialize\n * @returns {void}\n */\n private queueInitForNewVisibleDataSets(dataSetsRequiringInitialization: VisibleDataSetInfo[]) {\n LoggerProxy.logger.info(\n `HashTreeParser#queueInitForNewVisibleDataSets --> ${\n this.debugId\n } queuing initialization of new visible datasets: ${dataSetsRequiringInitialization\n .map((ds) => ds.name)\n .join(', ')}`\n );\n queueMicrotask(() => {\n this.initializeNewVisibleDataSets(dataSetsRequiringInitialization).catch((error) => {\n if (!this.handleSyncErrors(error)) {\n LoggerProxy.logger.warn(\n `HashTreeParser#queueInitForNewVisibleDataSets --> ${\n this.debugId\n } error while initializing new visible datasets: ${dataSetsRequiringInitialization\n .map((ds) => ds.name)\n .join(', ')}: `,\n error\n );\n }\n });\n });\n }\n\n /**\n * Handles updates to Metadata object that we receive from Locus via other means than messages. Right now\n * that means only in the API response alongside locus object.\n *\n * @param {Metadata} metadata received in Locus update other than a message (for example in an API response)\n * @param {HashTreeObject[]} updatedObjects a list of updated hash tree objects to which any updates resulting from new Metadata will be added\n * @returns {void}\n */\n handleMetadataUpdate(metadata: Metadata, updatedObjects: HashTreeObject[]): void {\n let dataSetsRequiringInitialization: VisibleDataSetInfo[] = [];\n\n // current assumption based on Locus docs is that Metadata object lives always in \"self\" data set\n const hashTree = this.dataSets[MetadataDataSetName]?.hashTree;\n\n if (!hashTree) {\n LoggerProxy.logger.warn(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received Metadata object but no hash tree for \"${MetadataDataSetName}\" data set exists`\n );\n } else {\n const metadataUpdated = hashTree.putItem(metadata.htMeta.elementId);\n\n if (metadataUpdated) {\n // metadata in Locus API response is in a slightly different format than the objects in messages, so need to adapt it\n const metadataObject: HashTreeObject = {\n htMeta: metadata.htMeta,\n data: metadata,\n };\n\n updatedObjects.push(metadataObject);\n\n const {changeDetected, removedDataSets, addedDataSets} = this.checkForVisibleDataSetChanges(\n [metadataObject]\n );\n\n if (changeDetected) {\n dataSetsRequiringInitialization = this.processVisibleDataSetChanges(\n removedDataSets,\n addedDataSets,\n updatedObjects\n );\n }\n\n if (dataSetsRequiringInitialization.length > 0) {\n // there are some data sets that we need to initialize asynchronously\n this.queueInitForNewVisibleDataSets(dataSetsRequiringInitialization);\n }\n }\n }\n }\n\n /**\n * This method should be called when we receive a partial locus DTO that contains dataSets and htMeta information\n * It updates the hash trees with the new leaf data based on the received Locus\n *\n * @param {Object} update - The locus update containing data sets and locus information\n * @returns {void}\n */\n handleLocusUpdate(update: {dataSets?: Array<DataSet>; locus: any; metadata?: Metadata}): void {\n if (this.state === 'stopped') {\n return;\n }\n\n const {dataSets, locus, metadata} = update;\n\n LoggerProxy.logger.info(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received update with dataSets=${dataSets\n ?.map((ds) => ds.name)\n .join(',')} metadata=${metadata ? 'yes' : 'no'}`\n );\n\n if (!dataSets) {\n // this happens for example when we handle GET /loci response\n LoggerProxy.logger.info(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received hash tree update without dataSets`\n );\n } else {\n for (const dataSet of dataSets) {\n this.updateDataSetInfo(dataSet);\n }\n }\n const updatedObjects: HashTreeObject[] = [];\n\n // first, analyze the locus object to extract the hash tree objects' htMeta and data from it\n const leafInfo = this.analyzeLocusHtMeta(locus, {copyData: true});\n\n // if we got metadata, process it (currently that means only potential visible data set list changes)\n if (metadata) {\n this.handleMetadataUpdate(metadata, updatedObjects);\n }\n\n // then process the data in hash trees, if it is a new version, then add it to updatedObjects\n Object.keys(leafInfo).forEach((dataSetName) => {\n if (this.dataSets[dataSetName]) {\n if (this.dataSets[dataSetName].hashTree) {\n const appliedChangesList = this.dataSets[dataSetName].hashTree.putItems(\n leafInfo[dataSetName].map((leaf) => ({\n id: leaf.id,\n type: leaf.type,\n version: leaf.version,\n }))\n );\n\n zip(appliedChangesList, leafInfo[dataSetName]).forEach(([changeApplied, leaf]) => {\n if (changeApplied) {\n updatedObjects.push({\n htMeta: {\n elementId: {\n type: leaf.type,\n id: leaf.id,\n version: leaf.version,\n },\n dataSetNames: [dataSetName],\n },\n data: leaf.data,\n });\n }\n });\n } else {\n // no hash tree means that the data set is not visible\n LoggerProxy.logger.warn(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received leaf data for data set \"${dataSetName}\" that has no hash tree created, ignoring`\n );\n }\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received leaf data for unknown data set \"${dataSetName}\", ignoring`\n );\n }\n });\n\n if (updatedObjects.length === 0) {\n LoggerProxy.logger.info(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} No objects updated as a result of received API response`\n );\n } else {\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.OBJECTS_UPDATED,\n updatedObjects,\n });\n }\n }\n\n /**\n * Updates the internal data set information based on the received data set from Locus.\n *\n * @param {DataSet} receivedDataSet - The latest data set information received from Locus to update the internal state.\n * @returns {void}\n */\n private updateDataSetInfo(receivedDataSet: DataSet) {\n if (!this.dataSets[receivedDataSet.name]) {\n this.dataSets[receivedDataSet.name] = {\n ...receivedDataSet,\n };\n\n LoggerProxy.logger.info(\n `HashTreeParser#updateDataSetInfo --> ${this.debugId} created entry for \"${receivedDataSet.name}\" dataset: version=${receivedDataSet.version}, root=${receivedDataSet.root}`\n );\n\n return;\n }\n // update our version of the dataSet\n if (this.dataSets[receivedDataSet.name].version < receivedDataSet.version) {\n this.dataSets[receivedDataSet.name].version = receivedDataSet.version;\n this.dataSets[receivedDataSet.name].root = receivedDataSet.root;\n this.dataSets[receivedDataSet.name].idleMs = receivedDataSet.idleMs;\n this.dataSets[receivedDataSet.name].backoff = {\n maxMs: receivedDataSet.backoff.maxMs,\n exponent: receivedDataSet.backoff.exponent,\n };\n LoggerProxy.logger.info(\n `HashTreeParser#updateDataSetInfo --> ${this.debugId} updated \"${receivedDataSet.name}\" dataset to version=${receivedDataSet.version}, root=${receivedDataSet.root}`\n );\n }\n }\n\n /**\n * Updates the leaf count for a data set, resizing its hash tree accordingly.\n *\n * @param {InternalDataSet} dataSet - The data set to update\n * @param {number} newLeafCount - The new leaf count\n * @returns {void}\n */\n private updateDataSetLeafCount(dataSet: InternalDataSet, newLeafCount: number): void {\n dataSet.hashTree?.resize(newLeafCount);\n dataSet.leafCount = newLeafCount;\n }\n\n /**\n * Checks for changes in the visible data sets based on the updated objects.\n * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects.\n * @returns {Object} An object containing the removed and added visible data sets.\n */\n private checkForVisibleDataSetChanges(updatedObjects: HashTreeObject[]) {\n let removedDataSets: VisibleDataSetInfo[] = [];\n let addedDataSets: VisibleDataSetInfo[] = [];\n\n // visibleDataSets can only be changed by Metadata object updates\n updatedObjects.forEach((object) => {\n if (isMetadata(object) && object.data?.visibleDataSets) {\n const newVisibleDataSets = object.data.visibleDataSets.filter(\n (vds) => !this.isExcludedDataSet(vds.name)\n );\n\n removedDataSets = this.visibleDataSets.filter(\n (ds) => !newVisibleDataSets.some((nvs) => nvs.name === ds.name)\n );\n addedDataSets = newVisibleDataSets.filter((nvs) =>\n this.visibleDataSets.every((ds) => ds.name !== nvs.name)\n );\n\n if (removedDataSets.length > 0 || addedDataSets.length > 0) {\n LoggerProxy.logger.info(\n `HashTreeParser#checkForVisibleDataSetChanges --> ${\n this.debugId\n } visible data sets change: removed: ${removedDataSets\n .map((ds) => ds.name)\n .join(', ')}, added: ${addedDataSets.map((ds) => ds.name).join(', ')}`\n );\n }\n }\n });\n\n return {\n changeDetected: removedDataSets.length > 0 || addedDataSets.length > 0,\n removedDataSets,\n addedDataSets,\n };\n }\n\n /**\n * Deletes the hash tree for the specified data set.\n *\n * @param {string} dataSetName name of the data set to delete\n * @returns {void}\n */\n private deleteHashTree(dataSetName: string) {\n this.dataSets[dataSetName].hashTree = undefined;\n\n // we also need to stop the timers as there is no hash tree anymore to sync\n if (this.dataSets[dataSetName].timer) {\n clearTimeout(this.dataSets[dataSetName].timer);\n this.dataSets[dataSetName].timer = undefined;\n }\n if (this.dataSets[dataSetName].heartbeatWatchdogTimer) {\n clearTimeout(this.dataSets[dataSetName].heartbeatWatchdogTimer);\n this.dataSets[dataSetName].heartbeatWatchdogTimer = undefined;\n }\n }\n\n /**\n * Adds entries to the passed in updateObjects array\n * for the changes that result from removing visible data sets and creates hash\n * trees for the new visible data sets, but without populating the hash trees.\n *\n * This function is synchronous. If we are missing information about some new\n * visible data sets and they require async initialization, the names of these data sets\n * are returned in an array.\n *\n * @param {VisibleDataSetInfo[]} removedDataSets - The list of removed data sets.\n * @param {VisibleDataSetInfo[]} addedDataSets - The list of added data sets.\n * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects to which changes will be added.\n * @returns {VisibleDataSetInfo[]} list of data sets that couldn't be initialized synchronously\n */\n private processVisibleDataSetChanges(\n removedDataSets: VisibleDataSetInfo[],\n addedDataSets: VisibleDataSetInfo[],\n updatedObjects: HashTreeObject[]\n ): VisibleDataSetInfo[] {\n const dataSetsRequiringInitialization: VisibleDataSetInfo[] = [];\n\n // if a visible data set was removed, we need to tell our client that all objects from it are removed\n const removedObjects: HashTreeObject[] = [];\n\n removedDataSets.forEach((ds) => {\n if (this.dataSets[ds.name]?.hashTree) {\n for (let i = 0; i < this.dataSets[ds.name].hashTree.numLeaves; i += 1) {\n removedObjects.push(\n ...this.dataSets[ds.name].hashTree.getLeafData(i).map((elementId) => ({\n htMeta: {\n elementId,\n dataSetNames: [ds.name],\n },\n data: null,\n }))\n );\n }\n\n this.deleteHashTree(ds.name);\n }\n });\n this.visibleDataSets = this.visibleDataSets.filter(\n (vds) => !removedDataSets.some((rds) => rds.name === vds.name)\n );\n updatedObjects.push(...removedObjects);\n\n // now setup the new visible data sets\n for (const ds of addedDataSets) {\n const dataSetInfo = this.dataSets[ds.name];\n\n if (dataSetInfo) {\n if (this.isVisibleDataSet(dataSetInfo.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} Data set \"${ds.name}\" is already visible, skipping`\n );\n\n // eslint-disable-next-line no-continue\n continue;\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} Adding visible data set \"${ds.name}\"`\n );\n\n if (!this.addToVisibleDataSetsList(ds)) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const hashTree = new HashTree([], dataSetInfo.leafCount);\n\n this.dataSets[dataSetInfo.name] = {\n ...dataSetInfo,\n hashTree,\n };\n\n // this call is needed here for the edge case where we receive a message with new visible data sets\n // and there are no objects belonging to these data sets in the message but we already have the info about them in this.dataSets\n this.runSyncAlgorithm(this.dataSets[dataSetInfo.name]);\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} visible data set \"${ds.name}\" added but no info about it in our dataSets structures`\n );\n // todo: add a metric here\n dataSetsRequiringInitialization.push(ds);\n }\n }\n\n return dataSetsRequiringInitialization;\n }\n\n /**\n * Adds entries to the passed in updateObjects array\n * for the changes that result from adding and removing visible data sets.\n *\n * @param {VisibleDataSetInfo[]} addedDataSets - The list of added data sets.\n * @returns {Promise<void>}\n */\n private async initializeNewVisibleDataSets(addedDataSets: VisibleDataSetInfo[]): Promise<void> {\n if (this.state === 'stopped') {\n return;\n }\n const allDataSets = await this.getAllVisibleDataSetsFromLocus();\n\n for (const ds of sortByInitPriority(addedDataSets, DATA_SET_INIT_PRIORITY)) {\n const dataSetInfo = allDataSets.find((d) => d.name === ds.name);\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSets --> ${this.debugId} initializing data set \"${ds.name}\"`\n );\n\n if (!dataSetInfo) {\n LoggerProxy.logger.warn(\n `HashTreeParser#initializeNewVisibleDataSets --> ${this.debugId} missing info about data set \"${ds.name}\" in Locus response from visibleDataSetsUrl`\n );\n } else {\n // eslint-disable-next-line no-await-in-loop\n await this.initializeNewVisibleDataSet(ds, dataSetInfo);\n }\n }\n }\n\n /**\n * Parses incoming hash tree messages, updates the hash trees and returns information about the changes\n *\n * @param {HashTreeMessage} message - The hash tree message containing data sets and objects to be processed\n * @param {string} [debugText] - Optional debug text to include in logs\n * @returns {HashTreeObject[]} list of hash tree objects that were updated as a result of processing the message\n */\n private parseMessage(message: HashTreeMessage, debugText?: string): HashTreeObject[] {\n if (this.state === 'stopped') {\n return [];\n }\n\n const {dataSets, visibleDataSetsUrl} = message;\n\n LoggerProxy.logger.info(\n `HashTreeParser#parseMessage --> ${this.debugId} ${\n debugText || ''\n } dataSets: ${message.dataSets\n ?.map(({name, version}) => `${name}:${version}`)\n .join(',')}, elements: ${message.locusStateElements\n ?.map(\n (el) =>\n `${el.htMeta.elementId.type}:${el.htMeta.elementId.id}:${el.htMeta.elementId.version}${\n el.data ? '+' : '-'\n }`\n )\n .join(',')}`\n );\n\n if (message.locusStateElements?.length === 0) {\n LoggerProxy.logger.warn(\n `HashTreeParser#parseMessage --> ${this.debugId} got empty locusStateElements!!!`\n );\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.HASH_TREE_EMPTY_LOCUS_STATE_ELEMENTS, {\n debugId: this.debugId,\n });\n }\n\n // first, update our metadata about the datasets with info from the message\n this.visibleDataSetsUrl = visibleDataSetsUrl;\n dataSets.forEach((dataSet) => this.updateDataSetInfo(dataSet));\n\n const updatedObjects: HashTreeObject[] = [];\n\n // when we detect new visible datasets, it may be that the metadata about them is not\n // available in the message, they will require separate async initialization\n let dataSetsRequiringInitialization: VisibleDataSetInfo[] = [];\n\n // first find out if there are any visible data set changes - they're signalled in Metadata object updates\n const metadataUpdates = (message.locusStateElements || []).filter((object) =>\n isMetadata(object)\n );\n\n if (metadataUpdates.length > 0) {\n const updatedMetadataObjects: HashTreeObject[] = [];\n\n metadataUpdates.forEach((object) => {\n // todo: once Locus supports it, we will use the \"view\" field here instead of dataSetNames\n for (const dataSetName of object.htMeta.dataSetNames) {\n const hashTree = this.dataSets[dataSetName]?.hashTree;\n\n if (hashTree && object.data) {\n if (hashTree.putItem(object.htMeta.elementId)) {\n updatedMetadataObjects.push(object);\n }\n }\n }\n });\n\n updatedObjects.push(...updatedMetadataObjects);\n\n const {changeDetected, removedDataSets, addedDataSets} =\n this.checkForVisibleDataSetChanges(updatedMetadataObjects);\n\n if (changeDetected) {\n dataSetsRequiringInitialization = this.processVisibleDataSetChanges(\n removedDataSets,\n addedDataSets,\n updatedObjects\n );\n }\n }\n\n if (message.locusStateElements && message.locusStateElements.length > 0) {\n // by this point we now have this.dataSets setup for data sets from this message\n // and hash trees created for the new visible data sets,\n // so we can now process all the updates from the message\n dataSets.forEach((dataSet) => {\n if (this.dataSets[dataSet.name]) {\n const {hashTree} = this.dataSets[dataSet.name];\n\n if (hashTree) {\n const locusStateElementsForThisSet = message.locusStateElements.filter((object) =>\n object.htMeta.dataSetNames.includes(dataSet.name)\n );\n\n const appliedChangesList = hashTree.updateItems(\n locusStateElementsForThisSet.map((object) =>\n object.data\n ? {operation: 'update', item: object.htMeta.elementId}\n : {operation: 'remove', item: object.htMeta.elementId}\n )\n );\n\n zip(appliedChangesList, locusStateElementsForThisSet).forEach(\n ([changeApplied, object]) => {\n if (changeApplied) {\n // add to updatedObjects so that our locus DTO will get updated with the new object\n updatedObjects.push(object);\n }\n }\n );\n } else {\n LoggerProxy.logger.info(\n `Locus-info:index#parseMessage --> ${this.debugId} unexpected (not visible) dataSet ${dataSet.name} received in hash tree message`\n );\n }\n }\n\n this.runSyncAlgorithm(dataSet);\n });\n }\n\n if (dataSetsRequiringInitialization.length > 0) {\n // there are some data sets that we need to initialize asynchronously\n this.queueInitForNewVisibleDataSets(dataSetsRequiringInitialization);\n }\n\n if (updatedObjects.length === 0) {\n LoggerProxy.logger.info(\n `HashTreeParser#parseMessage --> ${this.debugId} No objects updated as a result of received message`\n );\n }\n\n return updatedObjects;\n }\n\n /**\n * Handles incoming hash tree messages, updates the hash trees and calls locusInfoUpdateCallback\n *\n * @param {HashTreeMessage} message - The hash tree message containing data sets and objects to be processed\n * @param {string} [debugText] - Optional debug text to include in logs\n * @returns {void}\n */\n handleMessage(message: HashTreeMessage, debugText?: string) {\n if (this.state === 'stopped') {\n return;\n }\n\n if (message.heartbeatIntervalMs) {\n this.heartbeatIntervalMs = message.heartbeatIntervalMs;\n }\n if (this.isEndMessage(message)) {\n LoggerProxy.logger.info(\n `HashTreeParser#handleMessage --> ${this.debugId} received sentinel END MEETING message`\n );\n this.stopAllTimers();\n\n this.callLocusInfoUpdateCallback({updateType: LocusInfoUpdateType.MEETING_ENDED});\n } else if (message.locusStateElements === undefined) {\n this.handleRootHashHeartBeatMessage(message);\n this.resetHeartbeatWatchdogs(message.dataSets);\n } else {\n const updatedObjects = this.parseMessage(message, debugText);\n\n this.resetHeartbeatWatchdogs(message.dataSets);\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.OBJECTS_UPDATED,\n updatedObjects,\n });\n }\n }\n\n /**\n * Calls the updateInfo callback if there are any updates to report\n *\n * @param {Object} updates parsed from a Locus message\n * @returns {void}\n */\n private callLocusInfoUpdateCallback(updates: LocusInfoUpdate) {\n if (this.state === 'stopped') {\n return;\n }\n\n const {updateType} = updates;\n\n if (updateType === LocusInfoUpdateType.OBJECTS_UPDATED && updates.updatedObjects?.length > 0) {\n // Filter out updates for objects that already have a higher version in their datasets,\n // or removals for objects that still exist in any of their datasets\n const filteredUpdates = updates.updatedObjects.filter((object) => {\n const {elementId} = object.htMeta;\n const {type, id, version} = elementId;\n\n // Check all datasets\n for (const dataSetName of Object.keys(this.dataSets)) {\n const dataSet = this.dataSets[dataSetName];\n\n // only visible datasets have hash trees set\n if (dataSet?.hashTree) {\n const existingVersion = dataSet.hashTree.getItemVersion(id, type);\n if (existingVersion !== undefined) {\n if (object.data) {\n // For updates: filter out if any dataset has a higher version\n if (existingVersion > version) {\n LoggerProxy.logger.info(\n `HashTreeParser#callLocusInfoUpdateCallback --> ${this.debugId} Filtering out update for ${type}:${id} v${version} because dataset \"${dataSetName}\" has v${existingVersion}`\n );\n\n return false;\n }\n } else if (existingVersion >= version) {\n // For removals: filter out if the object still exists in any dataset\n LoggerProxy.logger.info(\n `HashTreeParser#callLocusInfoUpdateCallback --> ${this.debugId} Filtering out removal for ${type}:${id} v${version} because dataset \"${dataSetName}\" still has v${existingVersion}`\n );\n\n return false;\n }\n }\n }\n }\n\n return true;\n });\n\n if (filteredUpdates.length > 0) {\n this.locusInfoUpdateCallback({updateType, updatedObjects: filteredUpdates});\n }\n } else if (updateType !== LocusInfoUpdateType.OBJECTS_UPDATED) {\n this.locusInfoUpdateCallback({updateType});\n }\n }\n\n /**\n * Calculates a weighted backoff time that should be used for syncs\n *\n * @param {Object} backoff - The backoff configuration containing maxMs and exponent\n * @returns {number} - A weighted backoff time based on the provided configuration, using algorithm supplied by Locus team\n */\n private getWeightedBackoffTime(backoff: {maxMs: number; exponent: number}): number {\n const {maxMs, exponent} = backoff;\n\n const randomValue = Math.random();\n\n return Math.round(randomValue ** exponent * maxMs);\n }\n\n /**\n * Performs a sync for the given data set.\n *\n * @param {InternalDataSet} dataSet - The data set to sync\n * @param {string} reason - The reason for the sync (used for logging)\n * @param {boolean} [isInitialization] - Whether this is an initialization sync (sends empty leaves data instead of comparing hashes)\n * @returns {Promise<void>}\n */\n private async performSync(\n dataSet: InternalDataSet,\n reason: string,\n isInitialization?: boolean\n ): Promise<void> {\n if (!dataSet.hashTree) {\n return;\n }\n\n const {hashTree} = dataSet;\n const rootHash = hashTree.getRootHash();\n\n try {\n LoggerProxy.logger.info(\n `HashTreeParser#performSync --> ${this.debugId} ${reason}, syncing data set \"${dataSet.name}\"`\n );\n\n let leavesData: Record<number, LeafDataItem[]> = {};\n\n if (!isInitialization) {\n if (dataSet.leafCount !== 1) {\n let receivedHashes;\n\n try {\n // request hashes from sender\n const hashesResult = await this.getHashesFromLocus(dataSet.name, rootHash);\n\n if (!hashesResult) {\n // hashes match, no sync needed\n return;\n }\n\n receivedHashes = hashesResult.hashes;\n\n this.updateDataSetLeafCount(dataSet, hashesResult.dataSet.leafCount);\n } catch (error: any) {\n if (error?.statusCode === 409) {\n // this is a leaf count mismatch, we should do nothing, just wait for another heartbeat message from Locus\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Got 409 when fetching hashes for data set \"${dataSet.name}\": ${error.message}`\n );\n\n return;\n }\n throw error;\n }\n\n // identify mismatched leaves\n const mismatchedLeaveIndexes = hashTree.diffHashes(receivedHashes);\n\n mismatchedLeaveIndexes.forEach((index) => {\n leavesData[index] = hashTree.getLeafData(index);\n });\n } else {\n leavesData = {0: hashTree.getLeafData(0)};\n }\n }\n // request sync for mismatched leaves\n let syncResponse: HashTreeMessage | null = null;\n\n if (isInitialization) {\n syncResponse = await this.sendSyncRequestToLocus(dataSet, {isInitialization: true});\n } else if (Object.keys(leavesData).length > 0) {\n syncResponse = await this.sendSyncRequestToLocus(dataSet, {\n mismatchedLeavesData: leavesData,\n });\n }\n\n // sync API may return nothing (in that case data will arrive via messages)\n // or it may return a response in the same format as messages\n // We still need to restart the sync timer as a safety net in case the messages don't arrive.\n this.runSyncAlgorithm(dataSet);\n\n if (syncResponse) {\n // the format of sync response is the same as messages, so we can reuse the same handler\n this.handleMessage(syncResponse, 'via sync API');\n }\n } catch (error) {\n if (!this.handleSyncErrors(error)) {\n LoggerProxy.logger.warn(\n `HashTreeParser#performSync --> ${this.debugId} error during sync for data set \"${dataSet.name}\":`,\n error\n );\n }\n }\n }\n\n /**\n * Enqueues a sync for the given data set. If the data set is already in the queue, the request is ignored.\n * This ensures that all syncs are executed sequentially and no more than 1 sync runs at a time.\n *\n * @param {string} dataSetName - The name of the data set to sync\n * @param {string} reason - The reason for the sync (used for logging)\n * @param {boolean} [isInitialization=false] - Whether this is an initialization sync (uses empty leaves data instead of hash comparison)\n * @returns {void}\n */\n private enqueueSyncForDataset(\n dataSetName: string,\n reason: string,\n isInitialization = false\n ): void {\n if (this.state === 'stopped') return;\n\n const existingEntry = this.syncQueue.find((entry) => entry.dataSetName === dataSetName);\n\n if (existingEntry) {\n if (isInitialization) {\n existingEntry.isInitialization = true;\n }\n LoggerProxy.logger.info(\n `HashTreeParser#enqueueSyncForDataset --> ${this.debugId} data set \"${dataSetName}\" already in sync queue, skipping`\n );\n\n return;\n }\n\n this.syncQueue.push({dataSetName, reason, isInitialization});\n\n if (!this.isSyncInProgress) {\n this.syncQueueProcessingPromise = this.processSyncQueue();\n }\n }\n\n /**\n * Processes the sync queue sequentially. Only one instance of this method runs at a time.\n *\n * @returns {Promise<void>}\n */\n private async processSyncQueue(): Promise<void> {\n if (this.isSyncInProgress) return;\n\n this.isSyncInProgress = true;\n try {\n while (this.syncQueue.length > 0 && this.state !== 'stopped') {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const {dataSetName, reason, isInitialization} = this.syncQueue.shift()!;\n const dataSet = this.dataSets[dataSetName];\n\n if (!dataSet?.hashTree) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // eslint-disable-next-line no-await-in-loop\n await this.performSync(dataSet, reason, isInitialization);\n }\n } finally {\n this.isSyncInProgress = false;\n }\n }\n\n /**\n * Syncs all data sets that have hash trees, one by one in sequence, using the priority order\n * provided by sortByInitPriority(). Does nothing if the parser is stopped or if a syncAllDatasets\n * call is already in progress.\n *\n * @returns {Promise<void>}\n */\n public async syncAllDatasets(): Promise<void> {\n if (this.state === 'stopped') return;\n if (this.isSyncAllInProgress) return;\n\n this.isSyncAllInProgress = true;\n try {\n const dataSetsWithHashTrees = Object.values(this.dataSets)\n .filter((dataSet) => dataSet?.hashTree)\n .map((dataSet) => ({name: dataSet.name}));\n\n const sorted = sortByInitPriority(dataSetsWithHashTrees, DATA_SET_INIT_PRIORITY);\n\n LoggerProxy.logger.info(\n `HashTreeParser#syncAllDatasets --> ${this.debugId} syncing datasets: ${sorted\n .map((ds) => ds.name)\n .join(', ')}`\n );\n\n for (const ds of sorted) {\n this.enqueueSyncForDataset(ds.name, 'syncAllDatasets');\n }\n\n await this.syncQueueProcessingPromise;\n } finally {\n this.isSyncAllInProgress = false;\n }\n }\n\n /**\n * Runs the sync algorithm for the given data set.\n *\n * @param {DataSet} receivedDataSet - The data set to run the sync algorithm for.\n * @returns {void}\n */\n private runSyncAlgorithm(receivedDataSet: DataSet) {\n const dataSet = this.dataSets[receivedDataSet.name];\n\n if (!dataSet) {\n LoggerProxy.logger.warn(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} No data set found for ${receivedDataSet.name}, skipping sync algorithm`\n );\n\n return;\n }\n\n if (!dataSet.hashTree) {\n // no hash tree, so no need to do any syncing\n // we fall into this branch often, because Locus sends dataSets in messages that are not visible to us\n\n return;\n }\n\n dataSet.hashTree.resize(receivedDataSet.leafCount);\n\n const delay = dataSet.idleMs + this.getWeightedBackoffTime(dataSet.backoff);\n\n if (delay > 0) {\n if (dataSet.timer) {\n clearTimeout(dataSet.timer);\n }\n\n dataSet.timer = setTimeout(() => {\n dataSet.timer = undefined;\n\n if (!dataSet.hashTree) {\n LoggerProxy.logger.warn(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} Data set \"${dataSet.name}\" no longer has a hash tree, cannot run sync algorithm`\n );\n\n return;\n }\n\n const rootHash = dataSet.hashTree.getRootHash();\n\n if (dataSet.root !== rootHash) {\n this.enqueueSyncForDataset(\n dataSet.name,\n `Root hash mismatch: received=${dataSet.root}, ours=${rootHash}`\n );\n }\n }, delay);\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} No delay for \"${dataSet.name}\" data set, skipping sync timer reset/setup`\n );\n }\n }\n\n /**\n * Resets the heartbeat watchdog timers for the specified data sets. Each data set has its own\n * watchdog timer that monitors whether heartbeats are being received within the expected interval.\n * If a heartbeat is not received for a specific data set within heartbeatIntervalMs plus\n * a backoff-calculated time, the sync algorithm is initiated for that data set\n *\n * @param {Array<DataSet>} receivedDataSets - The data sets from the received message for which watchdog timers should be reset\n * @returns {void}\n */\n private resetHeartbeatWatchdogs(receivedDataSets: Array<DataSet>): void {\n if (!this.heartbeatIntervalMs) {\n return;\n }\n\n for (const receivedDataSet of receivedDataSets) {\n const dataSet = this.dataSets[receivedDataSet.name];\n\n if (!dataSet?.hashTree) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (dataSet.heartbeatWatchdogTimer) {\n clearTimeout(dataSet.heartbeatWatchdogTimer);\n dataSet.heartbeatWatchdogTimer = undefined;\n }\n\n const backoffTime = this.getWeightedBackoffTime(dataSet.backoff);\n const delay = this.heartbeatIntervalMs + backoffTime;\n\n dataSet.heartbeatWatchdogTimer = setTimeout(() => {\n dataSet.heartbeatWatchdogTimer = undefined;\n\n LoggerProxy.logger.warn(\n `HashTreeParser#resetHeartbeatWatchdogs --> ${this.debugId} Heartbeat watchdog fired for data set \"${dataSet.name}\" - no heartbeat received within expected interval, initiating sync`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.HASH_TREE_HEARTBEAT_WATCHDOG_EXPIRED, {\n debugId: this.debugId,\n dataSetName: dataSet.name,\n });\n\n this.enqueueSyncForDataset(dataSet.name, `heartbeat watchdog expired`);\n this.resetHeartbeatWatchdogs([dataSet]);\n }, delay);\n }\n }\n\n /**\n * Stops all timers for the data sets to prevent any further sync attempts.\n * @returns {void}\n */\n private stopAllTimers() {\n Object.values(this.dataSets).forEach((dataSet) => {\n if (dataSet.timer) {\n clearTimeout(dataSet.timer);\n dataSet.timer = undefined;\n }\n if (dataSet.heartbeatWatchdogTimer) {\n clearTimeout(dataSet.heartbeatWatchdogTimer);\n dataSet.heartbeatWatchdogTimer = undefined;\n }\n });\n }\n\n /**\n * Stops the HashTreeParser, preventing it from processing any further messages and clearing all timers.\n * It also clears all the hash trees, so if the parser is resumed later, it will need to do a sync\n * to be up-to-date.\n * @returns {void}\n */\n public stop() {\n LoggerProxy.logger.info(\n `HashTreeParser#stop --> ${this.debugId} Stopping HashTreeParser, clearing timers and hash trees`\n );\n this.stopAllTimers();\n this.syncQueue = [];\n Object.values(this.dataSets).forEach((dataSet) => {\n dataSet.hashTree = undefined;\n });\n this.visibleDataSets = [];\n this.state = 'stopped';\n }\n\n /**\n * Cleans up the HashTreeParser, stopping all timers and clearing all internal state.\n * After calling this, the parser should not be used anymore.\n * @returns {void}\n */\n public cleanUp() {\n this.stop();\n this.dataSets = {};\n }\n\n /**\n * Resumes the HashTreeParser that was previously stopped, using a hash tree message.\n * @param {HashTreeMessage} message - The message to resume with, it must contain metadata with visible data sets info\n * @returns {void}\n */\n public resumeFromMessage(message: HashTreeMessage) {\n // check that message contains metadata with visible data sets - this is essential to be able to resume\n const metadataObject = message.locusStateElements?.find((el) => isMetadata(el));\n\n if (!metadataObject?.data?.visibleDataSets) {\n LoggerProxy.logger.warn(\n `HashTreeParser#resumeFromMessage --> ${this.debugId} Cannot resume HashTreeParser because the message is missing metadata with visible data sets info`\n );\n\n return;\n }\n this.setVisibleDataSets(\n metadataObject.data.visibleDataSets as VisibleDataSetInfo[],\n message.dataSets\n );\n\n this.dataSets = {};\n\n for (const dataSet of message.dataSets) {\n const {name, leafCount} = dataSet;\n\n this.dataSets[name] = {\n ...dataSet,\n hashTree: this.isVisibleDataSet(name) ? new HashTree([], leafCount) : undefined,\n };\n }\n LoggerProxy.logger.info(\n `HashTreeParser#resumeFromMessage --> ${\n this.debugId\n } Resuming HashTreeParser with data sets: ${Object.keys(this.dataSets).join(\n ', '\n )}, visible data sets: ${this.visibleDataSets.map((ds) => ds.name).join(', ')}`\n );\n this.state = 'active';\n\n this.handleMessage(message, 'on resume');\n }\n\n /**\n * Resumes the HashTreeParser that was previously stopped, using a Locus API response.\n * Unlike resumeFromMessage(), this does not require metadata/dataSets in the input,\n * as it fetches all necessary information from Locus via initializeFromGetLociResponse.\n * @param {LocusDTO} locus - locus object from an API response\n * @returns {Promise}\n */\n public async resumeFromApiResponse(locus: LocusDTO) {\n this.state = 'active';\n this.dataSets = {};\n\n LoggerProxy.logger.info(\n `HashTreeParser#resumeFromApiResponse --> ${this.debugId} Resuming HashTreeParser from API response`\n );\n\n await this.initializeFromGetLociResponse(locus);\n }\n\n private checkForSentinelHttpResponse(error: any, dataSetName?: string) {\n // 404 for any dataset means the locus is no longer available at this URL - could be replaced or ended\n // if a dataset is just not visible, we would get a 400\n if (error.statusCode === 404) {\n LoggerProxy.logger.info(\n `HashTreeParser#checkForSentinelHttpResponse --> ${this.debugId} Received 404 for data set \"${dataSetName}\", locus not found`\n );\n this.stopAllTimers();\n\n throw new LocusNotFoundError();\n }\n\n const isValidDataSetForSentinel =\n dataSetName === undefined ||\n PossibleSentinelMessageDataSetNames.includes(dataSetName.toLowerCase());\n\n if (\n error.statusCode === 409 &&\n error.body?.errorCode === LocusErrorCodes.LOCUS_INACTIVE &&\n isValidDataSetForSentinel\n ) {\n LoggerProxy.logger.info(\n `HashTreeParser#checkForSentinelHttpResponse --> ${this.debugId} Received ${error.statusCode}/${error.body?.errorCode} for data set \"${dataSetName}\", indicating that the meeting has ended`\n );\n this.stopAllTimers();\n\n throw new MeetingEndedError();\n }\n }\n\n /**\n * Gets the current hashes from the locus for a specific data set.\n * @param {string} dataSetName\n * @param {string} currentRootHash\n * @returns {Object|null} An object containing the hashes and leaf count, or null if the hashes match and no sync is needed\n */\n private getHashesFromLocus(dataSetName: string, currentRootHash: string) {\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Requesting hashes for data set \"${dataSetName}\"`\n );\n\n const dataSet = this.dataSets[dataSetName];\n\n const url = `${dataSet.url}/hashtree`;\n\n return this.webexRequest({\n method: HTTP_VERBS.GET,\n uri: url,\n qs: {\n rootHash: currentRootHash,\n },\n })\n .then((response) => {\n if (!response.body || isEmpty(response.body)) {\n // 204 with empty body means our hashes match Locus, no sync needed\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Got ${response.statusCode} with empty body for data set \"${dataSetName}\", hashes match - no sync needed`\n );\n\n return null;\n }\n\n const hashes = response.body?.hashes as string[] | undefined;\n const dataSetFromResponse = response.body?.dataSet;\n\n if (!hashes || !Array.isArray(hashes)) {\n LoggerProxy.logger.warn(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Locus returned invalid hashes, response body=`,\n response.body\n );\n throw new Error(`Locus returned invalid hashes: ${hashes}`);\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${\n this.debugId\n } Received hashes for data set \"${dataSetName}\": ${JSON.stringify(hashes)}`\n );\n\n return {\n hashes,\n dataSet: dataSetFromResponse as DataSet,\n };\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Error ${error.statusCode} fetching hashes for data set \"${dataSetName}\":`,\n error\n );\n this.checkForSentinelHttpResponse(error, dataSet.name);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {\n debugId: this.debugId,\n dataSetName,\n request: 'GET /hashtree',\n statusCode: error.statusCode,\n reason: error.message,\n });\n\n throw error;\n });\n }\n\n /**\n * Sends a sync request to Locus for the specified data set.\n *\n * @param {InternalDataSet} dataSet The data set to sync.\n * @param {Object} options Either `{ isInitialization: true }` for init syncs (uses leafCount=1 with empty leaf data) or `{ mismatchedLeavesData }` for normal syncs.\n * @returns {Promise<HashTreeMessage|null>}\n */\n private sendSyncRequestToLocus(\n dataSet: InternalDataSet,\n options: {isInitialization: true} | {mismatchedLeavesData: Record<number, LeafDataItem[]>}\n ): Promise<HashTreeMessage | null> {\n LoggerProxy.logger.info(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Sending sync request for data set \"${dataSet.name}\"`\n );\n\n const isInitialization = 'isInitialization' in options;\n\n const url = `${dataSet.url}/sync`;\n const body: {\n leafCount: number;\n leafDataEntries: {leafIndex: number; elementIds: LeafDataItem[]}[];\n } = {\n leafCount: isInitialization ? 1 : dataSet.leafCount,\n leafDataEntries: [],\n };\n\n if (isInitialization) {\n // initialization sync: Locus requires leafCount=1 with a single empty leaf\n body.leafDataEntries.push({leafIndex: 0, elementIds: []});\n } else {\n const {mismatchedLeavesData} = options;\n\n Object.keys(mismatchedLeavesData).forEach((index) => {\n const leafIndex = parseInt(index, 10);\n\n body.leafDataEntries.push({\n leafIndex,\n elementIds: mismatchedLeavesData[leafIndex],\n });\n });\n }\n\n const ourCurrentRootHash = dataSet.hashTree ? dataSet.hashTree.getRootHash() : EMPTY_HASH;\n\n return this.webexRequest({\n method: HTTP_VERBS.POST,\n uri: url,\n qs: {\n rootHash: ourCurrentRootHash,\n },\n body,\n })\n .then((resp) => {\n if (!resp.body || isEmpty(resp.body)) {\n LoggerProxy.logger.info(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Got ${resp.statusCode} with empty body for sync request for data set \"${dataSet.name}\", data should arrive via messages`\n );\n\n return null;\n }\n\n return resp.body as HashTreeMessage;\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Error ${error.statusCode} sending sync request for data set \"${dataSet.name}\":`,\n error\n );\n this.checkForSentinelHttpResponse(error, dataSet.name);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {\n debugId: this.debugId,\n dataSetName: dataSet.name,\n request: 'POST /sync',\n statusCode: error.statusCode,\n reason: error.message,\n });\n\n throw error;\n });\n }\n}\n\nexport default HashTreeParser;\n"],"mappings":"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","ignoreList":[]}
|