@webex/plugin-meetings 3.10.0-next.14 → 3.10.0-next.16

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.
Files changed (37) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/hashTree/constants.js +20 -0
  4. package/dist/hashTree/constants.js.map +1 -0
  5. package/dist/hashTree/hashTree.js +515 -0
  6. package/dist/hashTree/hashTree.js.map +1 -0
  7. package/dist/hashTree/hashTreeParser.js +1115 -14
  8. package/dist/hashTree/hashTreeParser.js.map +1 -1
  9. package/dist/hashTree/types.js +10 -3
  10. package/dist/hashTree/types.js.map +1 -1
  11. package/dist/hashTree/utils.js +48 -0
  12. package/dist/hashTree/utils.js.map +1 -0
  13. package/dist/interpretation/index.js +1 -1
  14. package/dist/interpretation/siLanguage.js +1 -1
  15. package/dist/locus-info/index.js +59 -49
  16. package/dist/locus-info/index.js.map +1 -1
  17. package/dist/locus-info/types.js.map +1 -1
  18. package/dist/types/hashTree/constants.d.ts +8 -0
  19. package/dist/types/hashTree/hashTree.d.ts +129 -0
  20. package/dist/types/hashTree/hashTreeParser.d.ts +151 -0
  21. package/dist/types/hashTree/types.d.ts +11 -0
  22. package/dist/types/hashTree/utils.d.ts +9 -0
  23. package/dist/types/locus-info/index.d.ts +5 -15
  24. package/dist/types/locus-info/types.d.ts +21 -12
  25. package/dist/webinar/index.js +1 -1
  26. package/package.json +22 -21
  27. package/src/hashTree/constants.ts +9 -0
  28. package/src/hashTree/hashTree.ts +463 -0
  29. package/src/hashTree/hashTreeParser.ts +1022 -7
  30. package/src/hashTree/types.ts +13 -1
  31. package/src/hashTree/utils.ts +42 -0
  32. package/src/locus-info/index.ts +64 -48
  33. package/src/locus-info/types.ts +19 -12
  34. package/test/unit/spec/hashTree/hashTree.ts +655 -0
  35. package/test/unit/spec/hashTree/hashTreeParser.ts +1532 -0
  36. package/test/unit/spec/hashTree/utils.ts +103 -0
  37. package/test/unit/spec/locus-info/index.js +150 -7
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","LocusInfoUpdateType","exports","OBJECTS_UPDATED","MEETING_ENDED","MeetingEndedError","_Error","_classCallCheck2","arguments","_inherits2","_createClass2","_wrapNativeSuper2","Error","isSelf","object","htMeta","elementId","type","toLowerCase","ObjectType","self","HashTreeParser","options","_locus$self","_defineProperty2","locus","initialLocus","debugId","webexRequest","locusInfoUpdateCallback","visibleDataSets","key","value","_initializeFromMessage","_asyncToGenerator2","_regenerator","mark","_callee","message","wrap","_context","prev","next","stop","initializeFromMessage","_x","_initializeFromGetLociResponse","_callee2","_context2","initializeFromGetLociResponse","_x2","handleLocusUpdate","update","_handleMessage","_callee3","debugText","_context3","handleMessage","_x3","_x4","_default"],"sources":["hashTreeParser.ts"],"sourcesContent":["import {Enum} from '../constants';\nimport {ObjectType, HtMeta} from './types';\nimport {LocusDTO} from '../locus-info/types';\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 HashTreeObject {\n htMeta: HtMeta;\n data: Record<string, any>;\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}\n\ninterface InternalDataSet extends DataSet {\n // hashTree?: HashTree; // set only for visible data sets\n timer?: ReturnType<typeof setTimeout>;\n}\n\ntype WebexRequestMethod = (options: Record<string, any>) => Promise<any>;\n\nexport const LocusInfoUpdateType = {\n OBJECTS_UPDATED: 'OBJECTS_UPDATED',\n MEETING_ENDED: 'MEETING_ENDED',\n} as const;\n\nexport type LocusInfoUpdateType = Enum<typeof LocusInfoUpdateType>;\nexport type LocusInfoUpdateCallback = (\n updateType: LocusInfoUpdateType,\n data?: {updatedObjects: HashTreeObject[]}\n) => void;\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 */\nclass MeetingEndedError extends Error {}\n\n/**\n * Checks if the given hash tree object is of type \"self\"\n * @param {HashTreeObject} object object to check\n * @returns {boolean} True if the object is of type \"self\", false otherwise\n */\nexport function isSelf(object: HashTreeObject) {\n return object.htMeta.elementId.type.toLowerCase() === ObjectType.self;\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: string[];\n debugId: string;\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 webexRequest: WebexRequestMethod;\n locusInfoUpdateCallback: LocusInfoUpdateCallback;\n debugId: string;\n }) {\n const {locus} = options.initialLocus;\n\n this.debugId = options.debugId;\n this.webexRequest = options.webexRequest;\n this.locusInfoUpdateCallback = options.locusInfoUpdateCallback;\n this.visibleDataSets = locus?.self?.visibleDataSets || [];\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 // todo\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 // todo\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}): void {\n // todo\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 async handleMessage(message: HashTreeMessage, debugText?: string): Promise<void> {\n // todo\n }\n}\n\nexport default HashTreeParser;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_lodash","require","_hashTree","_interopRequireDefault","_loggerProxy","_constants","_constants2","_types","_utils","ownKeys","e","r","t","_Object$keys3","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray2","_unsupportedIterableToArray","_n","F","s","n","done","value","f","TypeError","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","Boolean","prototype","valueOf","LocusInfoUpdateType","exports","OBJECTS_UPDATED","MEETING_ENDED","MeetingEndedError","_Error","_classCallCheck2","_inherits2","_createClass2","_wrapNativeSuper2","Error","isSelf","object","htMeta","elementId","type","toLowerCase","ObjectType","self","HashTreeParser","options","_locus$self","_options$initialLocus","initialLocus","dataSets","locus","debugId","webexRequest","locusInfoUpdateCallback","visibleDataSets","LoggerProxy","logger","warn","concat","leafData","analyzeLocusHtMeta","info","_stringify","map","ds","_iterator","_step","dataSet","leafCount","hashTree","includes","HashTree","undefined","err","key","initializeNewVisibleDataSet","_promise","resolve","updateType","updatedObjects","sendInitializationSyncRequestToLocus","datasetName","debugText","_this","dataset","emptyLeavesData","fill","sendSyncRequestToLocus","then","syncResponse","parseMessage","getAllDataSetsMetadata","url","method","HTTP_VERBS","GET","uri","response","body","_initializeFromMessage","_asyncToGenerator2","_regenerator","mark","_callee","message","wrap","_context","prev","visibleDataSetsUrl","sent","initializeDataSets","stop","initializeFromMessage","_x","_initializeFromGetLociResponse","_callee2","_locus$links","_locus$links$resource","_locus$links$resource2","_context2","links","resources","abrupt","initializeFromGetLociResponse","_x2","_initializeDataSets","_callee3","_iterator2","_step2","_data","_t","_context3","data","_toConsumableArray2","finish","callLocusInfoUpdateCallback","_x3","_x4","_ref","_ref$copyData","copyData","leafInfo","findAndStoreMetaData","currentLocusPart","_typeof2","dataSetNames","_currentLocusPart$htM","id","version","newLeafInfo","cloneDeep","deleteNestedObjectsWithHtMeta","_iterator3","_step3","dataSetName","_isArray","_iterator4","_step4","item","_i","_Object$keys","_keys","hasOwnProperty","isEndMessage","mainDataSet","find","DataSetNames","MAIN","root","EMPTY_HASH","handleRootHashHeartBeatMessage","_this2","_ref2","updateDataSetInfo","runSyncAlgorithm","handleLocusUpdate","update","_this3","_iterator5","_step5","appliedChangesList","putItems","leaf","zip","_ref3","_ref4","_slicedToArray2","changeApplied","receivedDataSet","idleMs","backoff","maxMs","exponent","checkForVisibleDataSetChanges","_this4","removedDataSets","addedDataSets","_object$data","newVisibleDataSets","join","changeDetected","deleteHashTree","timer","clearTimeout","processVisibleDataSetChanges","_this5","dataSetsRequiringInitialization","removedObjects","_this5$dataSets$ds","i","numLeaves","getLeafData","vds","_iterator6","_step6","dataSetInfo","_initializeNewVisibleDataSets","_callee4","_this6","allDataSets","_iterator7","_step7","_loop","_t2","_context5","updates","_context4","d","delegateYield","initializeNewVisibleDataSets","_x5","_x6","_parseMessage","_callee5","_message$locusStateEl","_this7","isRosterDropped","selfUpdates","updatedSelfObjects","_this$checkForVisible","_context6","locusStateElements","stopAllTimers","_iterator8","_step8","_this7$dataSets$dataS","putItem","locusStateElementsForThisSet","updateItems","operation","_ref5","_ref6","queueMicrotask","_x7","_x8","_handleMessage","_callee6","_context7","handleMessage","_x9","_x0","getWeightedBackoffTime","randomValue","Math","random","round","pow","_this8","resize","ourCurrentRootHash","getRootHash","delay","setTimeout","_callee7","rootHash","mismatchedLeavesData","receivedHashes","_yield$_this8$getHash","hashes","latestDataSetInfo","mismatchedLeaveIndexes","_t3","_context8","getHashesFromLocus","statusCode","diffHashes","index","_values","_this9","_response$body","_response$body2","dataSetFromResponse","catch","error","_dataSet$hashTree","_this0","leafDataEntries","leafIndex","_parseInt2","elementIds","POST","resp","isEmpty","_default"],"sources":["hashTreeParser.ts"],"sourcesContent":["import {cloneDeep, isEmpty, zip} from 'lodash';\nimport HashTree, {LeafDataItem} from './hashTree';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {Enum, HTTP_VERBS} from '../constants';\nimport {DataSetNames, EMPTY_HASH} from './constants';\nimport {ObjectType, HtMeta} from './types';\nimport {LocusDTO} from '../locus-info/types';\nimport {deleteNestedObjectsWithHtMeta} 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 HashTreeObject {\n htMeta: HtMeta;\n data: Record<string, any>;\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}\n\ninterface InternalDataSet extends DataSet {\n hashTree?: HashTree; // set only for visible data sets\n timer?: ReturnType<typeof setTimeout>;\n}\n\ntype WebexRequestMethod = (options: Record<string, any>) => Promise<any>;\n\nexport const LocusInfoUpdateType = {\n OBJECTS_UPDATED: 'OBJECTS_UPDATED',\n MEETING_ENDED: 'MEETING_ENDED',\n} as const;\n\nexport type LocusInfoUpdateType = Enum<typeof LocusInfoUpdateType>;\nexport type LocusInfoUpdateCallback = (\n updateType: LocusInfoUpdateType,\n data?: {updatedObjects: HashTreeObject[]}\n) => void;\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 */\nclass MeetingEndedError extends Error {}\n\n/**\n * Checks if the given hash tree object is of type \"self\"\n * @param {HashTreeObject} object object to check\n * @returns {boolean} True if the object is of type \"self\", false otherwise\n */\nexport function isSelf(object: HashTreeObject) {\n return object.htMeta.elementId.type.toLowerCase() === ObjectType.self;\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: string[];\n debugId: string;\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 webexRequest: WebexRequestMethod;\n locusInfoUpdateCallback: LocusInfoUpdateCallback;\n debugId: 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.visibleDataSets = locus?.self?.visibleDataSets || [];\n\n if (this.visibleDataSets.length === 0) {\n LoggerProxy.logger.warn(\n `HashTreeParser#constructor --> ${this.debugId} No visibleDataSets found in locus.self`\n );\n }\n // object mapping dataset names to arrays of leaf data\n const leafData = this.analyzeLocusHtMeta(locus);\n\n LoggerProxy.logger.info(\n `HashTreeParser#constructor --> creating HashTreeParser for datasets: ${JSON.stringify(\n dataSets.map((ds) => ds.name)\n )}`\n );\n\n for (const dataSet of dataSets) {\n const {name, leafCount} = dataSet;\n\n this.dataSets[name] = {\n ...dataSet,\n hashTree: this.visibleDataSets.includes(name)\n ? new HashTree(leafData[name] || [], leafCount)\n : undefined,\n };\n }\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 {DataSet} dataSet The new data set to be added\n * @returns {Promise}\n */\n private initializeNewVisibleDataSet(\n dataSet: DataSet\n ): Promise<{updateType: LocusInfoUpdateType; updatedObjects?: HashTreeObject[]}> {\n if (this.visibleDataSets.includes(dataSet.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSet --> ${this.debugId} Data set \"${dataSet.name}\" already exists, skipping init`\n );\n\n return Promise.resolve({updateType: LocusInfoUpdateType.OBJECTS_UPDATED, updatedObjects: []});\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSet --> ${this.debugId} Adding visible data set \"${dataSet.name}\"`\n );\n\n this.visibleDataSets.push(dataSet.name);\n\n const hashTree = new HashTree([], dataSet.leafCount);\n\n this.dataSets[dataSet.name] = {\n ...dataSet,\n hashTree,\n };\n\n return this.sendInitializationSyncRequestToLocus(dataSet.name, 'new visible data set');\n }\n\n /**\n * Sends a special sync request to Locus with all leaves empty - this is a way to get all the data for a given dataset.\n *\n * @param {string} datasetName - name of the dataset for which to send the request\n * @param {string} debugText - text to include in logs\n * @returns {Promise}\n */\n private sendInitializationSyncRequestToLocus(\n datasetName: string,\n debugText: string\n ): Promise<{updateType: LocusInfoUpdateType; updatedObjects?: HashTreeObject[]}> {\n const dataset = this.dataSets[datasetName];\n\n if (!dataset) {\n LoggerProxy.logger.warn(\n `HashTreeParser#sendInitializationSyncRequestToLocus --> ${this.debugId} No data set found for ${datasetName}, cannot send the request for leaf data`\n );\n\n return Promise.resolve(null);\n }\n\n const emptyLeavesData = new Array(dataset.leafCount).fill([]);\n\n LoggerProxy.logger.info(\n `HashTreeParser#sendInitializationSyncRequestToLocus --> ${this.debugId} Sending initial sync request to Locus for data set \"${datasetName}\" with empty leaf data`\n );\n\n return this.sendSyncRequestToLocus(this.dataSets[datasetName], emptyLeavesData).then(\n (syncResponse) => {\n if (syncResponse) {\n return this.parseMessage(\n syncResponse,\n `via empty leaves /sync API call for ${debugText}`\n );\n }\n\n return {updateType: LocusInfoUpdateType.OBJECTS_UPDATED, updatedObjects: []};\n }\n );\n }\n\n /**\n * Queries Locus for information about all the data sets\n *\n * @param {string} url - url from which we can get info about all data sets\n * @returns {Promise}\n */\n private getAllDataSetsMetadata(url) {\n return this.webexRequest({\n method: HTTP_VERBS.GET,\n uri: url,\n }).then((response) => {\n return response.body.dataSets as Array<DataSet>;\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 LoggerProxy.logger.info(\n `HashTreeParser#initializeFromMessage --> ${this.debugId} visibleDataSetsUrl=${message.visibleDataSetsUrl}`\n );\n const dataSets = await this.getAllDataSetsMetadata(message.visibleDataSetsUrl);\n\n await this.initializeDataSets(dataSets, '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\n LoggerProxy.logger.info(\n `HashTreeParser#initializeFromGetLociResponse --> ${this.debugId} visibleDataSets url: ${locus.links.resources.visibleDataSets.url}`\n );\n\n const dataSets = await this.getAllDataSetsMetadata(locus.links.resources.visibleDataSets.url);\n\n await this.initializeDataSets(dataSets, '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[]} dataSets Array of DataSet objects to initialize\n * @param {string} debugText Text to include in logs for debugging purposes\n * @returns {Promise}\n */\n private async initializeDataSets(dataSets: Array<DataSet>, debugText: string) {\n const updatedObjects: HashTreeObject[] = [];\n\n for (const dataSet of dataSets) {\n const {name, leafCount} = 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.visibleDataSets.includes(name) && !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 // eslint-disable-next-line no-await-in-loop\n const data = await this.sendInitializationSyncRequestToLocus(name, debugText);\n\n if (data.updateType === LocusInfoUpdateType.MEETING_ENDED) {\n LoggerProxy.logger.warn(\n `HashTreeParser#initializeDataSets --> ${this.debugId} meeting ended while initializing new visible data set \"${name}\"`\n );\n\n // throw an error, it will be caught higher up and the meeting will be destroyed\n throw new MeetingEndedError();\n }\n\n if (data.updateType === LocusInfoUpdateType.OBJECTS_UPDATED) {\n updatedObjects.push(...(data.updatedObjects || []));\n }\n }\n }\n\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.OBJECTS_UPDATED,\n updatedObjects,\n });\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<\n string,\n Array<{type: ObjectType; id: number; version: number; data?: any}>\n > = {};\n\n const findAndStoreMetaData = (currentLocusPart: any) => {\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: {type: ObjectType; id: number; version: number; data?: any} = {\n type,\n id,\n version,\n };\n\n if (copyData) {\n newLeafInfo.data = cloneDeep(currentLocusPart);\n\n // remove any nested other objects that have their own htMeta\n deleteNestedObjectsWithHtMeta(newLeafInfo.data);\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 item of currentLocusPart) {\n findAndStoreMetaData(item);\n }\n } else {\n for (const key of Object.keys(currentLocusPart)) {\n if (Object.prototype.hasOwnProperty.call(currentLocusPart, key)) {\n findAndStoreMetaData(currentLocusPart[key]);\n }\n }\n }\n };\n\n findAndStoreMetaData(locus);\n\n return leafInfo;\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 const mainDataSet = message.dataSets.find(\n (dataSet) => dataSet.name.toLowerCase() === DataSetNames.MAIN\n );\n\n if (\n mainDataSet &&\n mainDataSet.leafCount === 1 &&\n mainDataSet.root === EMPTY_HASH &&\n this.dataSets[DataSetNames.MAIN].version < mainDataSet.version\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 * 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 * 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}): void {\n const {dataSets, locus} = update;\n\n if (!dataSets) {\n LoggerProxy.logger.warn(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received hash tree update without dataSets`\n );\n }\n for (const dataSet of dataSets) {\n this.updateDataSetInfo(dataSet);\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 // 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.warn(\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 // todo: once Locus design on how visible data sets will be communicated in subsequent API responses is confirmed,\n // we'll need to check here if visible data sets have changed and update this.visibleDataSets, remove/create hash trees etc\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#handleMessage --> ${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#handleMessage --> ${this.debugId} updated \"${receivedDataSet.name}\" to version=${receivedDataSet.version}, root=${receivedDataSet.root}`\n );\n }\n }\n\n /**\n * Checks for changes in the visible data sets based on the updated objects.\n * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects.\n * @returns {Object} An object containing the removed and added visible data sets.\n */\n private checkForVisibleDataSetChanges(updatedObjects: HashTreeObject[]) {\n let removedDataSets: string[] = [];\n let addedDataSets: string[] = [];\n\n // visibleDataSets can only be changed by self object updates\n updatedObjects.forEach((object) => {\n // todo: in the future visibleDataSets will be in \"Metadata\" object, not in \"self\"\n if (isSelf(object) && object.data?.visibleDataSets) {\n const newVisibleDataSets = object.data.visibleDataSets;\n\n removedDataSets = this.visibleDataSets.filter((ds) => !newVisibleDataSets.includes(ds));\n addedDataSets = newVisibleDataSets.filter((ds) => !this.visibleDataSets.includes(ds));\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.join(\n ', '\n )}, added: ${addedDataSets.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 timer 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 }\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 {string[]} removedDataSets - The list of removed data sets.\n * @param {string[]} 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 {string[]} names of data sets that couldn't be initialized synchronously\n */\n private processVisibleDataSetChanges(\n removedDataSets: string[],\n addedDataSets: string[],\n updatedObjects: HashTreeObject[]\n ): string[] {\n const dataSetsRequiringInitialization = [];\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]?.hashTree) {\n for (let i = 0; i < this.dataSets[ds].hashTree.numLeaves; i += 1) {\n removedObjects.push(\n ...this.dataSets[ds].hashTree.getLeafData(i).map((elementId) => ({\n htMeta: {\n elementId,\n dataSetNames: [ds],\n },\n data: null,\n }))\n );\n }\n\n this.deleteHashTree(ds);\n }\n });\n this.visibleDataSets = this.visibleDataSets.filter((vds) => !removedDataSets.includes(vds));\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];\n\n if (dataSetInfo) {\n if (this.visibleDataSets.includes(dataSetInfo.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} Data set \"${ds}\" 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}\"`\n );\n\n this.visibleDataSets.push(ds);\n\n const hashTree = new HashTree([], dataSetInfo.leafCount);\n\n this.dataSets[dataSetInfo.name] = {\n ...dataSetInfo,\n hashTree,\n };\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} visible data set \"${ds}\" 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 {HashTreeMessage} message - The hash tree message that triggered the visible data set changes.\n * @param {string[]} addedDataSets - The list of added data sets.\n * @returns {Promise<void>}\n */\n private async initializeNewVisibleDataSets(\n message: HashTreeMessage,\n addedDataSets: string[]\n ): Promise<void> {\n const allDataSets = await this.getAllDataSetsMetadata(message.visibleDataSetsUrl);\n\n for (const ds of addedDataSets) {\n const dataSetInfo = allDataSets.find((d) => d.name === ds);\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSets --> ${this.debugId} initializing data set \"${ds}\"`\n );\n\n if (!dataSetInfo) {\n LoggerProxy.logger.warn(\n `HashTreeParser#handleHashTreeMessage --> ${this.debugId} missing info about data set \"${ds}\" in Locus response from visibleDataSetsUrl`\n );\n } else {\n // we're awaiting in a loop, because in practice there will be only one new data set at a time,\n // so no point in trying to parallelize this\n // eslint-disable-next-line no-await-in-loop\n const updates = await this.initializeNewVisibleDataSet(dataSetInfo);\n\n this.callLocusInfoUpdateCallback(updates);\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 {Promise}\n */\n private async parseMessage(\n message: HashTreeMessage,\n debugText?: string\n ): Promise<{updateType: LocusInfoUpdateType; updatedObjects?: HashTreeObject[]}> {\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 if (this.isEndMessage(message)) {\n LoggerProxy.logger.info(\n `HashTreeParser#parseMessage --> ${this.debugId} received END message`\n );\n this.stopAllTimers();\n\n return {updateType: LocusInfoUpdateType.MEETING_ENDED};\n }\n\n let isRosterDropped = false;\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 = [];\n\n // first find out if there are any visible data set changes - they're signalled in SELF object updates\n const selfUpdates = (message.locusStateElements || []).filter((object) =>\n // todo: SPARK-744859 once Locus supports it, we will filter for \"Metadata\" type here instead of \"self\"\n isSelf(object)\n );\n\n if (selfUpdates.length > 0) {\n const updatedSelfObjects = [];\n\n selfUpdates.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 updatedSelfObjects.push(object);\n }\n }\n }\n });\n\n updatedObjects.push(...updatedSelfObjects);\n\n const {changeDetected, removedDataSets, addedDataSets} =\n this.checkForVisibleDataSetChanges(updatedSelfObjects);\n\n if (changeDetected) {\n dataSetsRequiringInitialization = this.processVisibleDataSetChanges(\n removedDataSets,\n addedDataSets,\n updatedObjects\n );\n }\n }\n\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 if (isSelf(object) && !object.data) {\n isRosterDropped = true;\n }\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 if (!isRosterDropped) {\n this.runSyncAlgorithm(dataSet);\n }\n });\n\n if (isRosterDropped) {\n LoggerProxy.logger.info(\n `HashTreeParser#parseMessage --> ${this.debugId} detected roster drop`\n );\n this.stopAllTimers();\n\n // in case of roster drop we don't care about other updates\n return {updateType: LocusInfoUpdateType.MEETING_ENDED};\n }\n\n if (dataSetsRequiringInitialization.length > 0) {\n // there are some data sets that we need to initialize asynchronously\n queueMicrotask(() => {\n this.initializeNewVisibleDataSets(message, dataSetsRequiringInitialization);\n });\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 {updateType: LocusInfoUpdateType.OBJECTS_UPDATED, 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 async handleMessage(message: HashTreeMessage, debugText?: string): Promise<void> {\n if (message.locusStateElements === undefined) {\n this.handleRootHashHeartBeatMessage(message);\n } else {\n const updates = await this.parseMessage(message, debugText);\n\n this.callLocusInfoUpdateCallback(updates);\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: {\n updateType: LocusInfoUpdateType;\n updatedObjects?: HashTreeObject[];\n }) {\n const {updateType, updatedObjects} = updates;\n\n if (updateType !== LocusInfoUpdateType.OBJECTS_UPDATED || updatedObjects?.length > 0) {\n this.locusInfoUpdateCallback(updateType, {updatedObjects});\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 * Runs the sync algorithm for the given data set.\n *\n * @param {DataSet} receivedDataSet - The data set to run the sync algorithm for.\n * @returns {void}\n */\n private runSyncAlgorithm(receivedDataSet: DataSet) {\n const dataSet = this.dataSets[receivedDataSet.name];\n\n if (!dataSet) {\n LoggerProxy.logger.warn(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} No data set found for ${receivedDataSet.name}, skipping sync algorithm`\n );\n\n return;\n }\n\n if (!dataSet.hashTree) {\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} Data set \"${dataSet.name}\" has no hash tree, skipping sync algorithm`\n );\n\n return;\n }\n\n dataSet.hashTree.resize(receivedDataSet.leafCount);\n\n // temporary log for the workshop // todo: remove\n const ourCurrentRootHash = dataSet.hashTree.getRootHash();\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} dataSet=\"${dataSet.name}\" version=${dataSet.version} hashes before starting timer: ours=${ourCurrentRootHash} Locus=${dataSet.root}`\n );\n\n const delay = dataSet.idleMs + this.getWeightedBackoffTime(dataSet.backoff);\n\n if (delay > 0) {\n if (dataSet.timer) {\n clearTimeout(dataSet.timer);\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} setting \"${dataSet.name}\" sync timer for ${delay}`\n );\n\n dataSet.timer = setTimeout(async () => {\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 LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} Root hash mismatch: received=${dataSet.root}, ours=${rootHash}, syncing data set \"${dataSet.name}\"`\n );\n\n const mismatchedLeavesData: Record<number, LeafDataItem[]> = {};\n\n if (dataSet.leafCount !== 1) {\n let receivedHashes;\n\n try {\n // request hashes from sender\n const {hashes, dataSet: latestDataSetInfo} = await this.getHashesFromLocus(\n dataSet.name\n );\n\n receivedHashes = hashes;\n\n dataSet.hashTree.resize(latestDataSetInfo.leafCount);\n } catch (error) {\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 = dataSet.hashTree.diffHashes(receivedHashes);\n\n mismatchedLeaveIndexes.forEach((index) => {\n mismatchedLeavesData[index] = dataSet.hashTree.getLeafData(index);\n });\n } else {\n mismatchedLeavesData[0] = dataSet.hashTree.getLeafData(0);\n }\n // request sync for mismatched leaves\n if (Object.keys(mismatchedLeavesData).length > 0) {\n const syncResponse = await this.sendSyncRequestToLocus(dataSet, mismatchedLeavesData);\n\n // sync API may return nothing (in that case data will arrive via messages)\n // or it may return a response in the same format as messages\n if (syncResponse) {\n this.handleMessage(syncResponse, 'via sync API');\n }\n }\n } 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 * 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 });\n }\n\n /**\n * Gets the current hashes from the locus for a specific data set.\n * @param {string} dataSetName\n * @returns {string[]}\n */\n private getHashesFromLocus(dataSetName: 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 })\n .then((response) => {\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 throw error;\n });\n }\n\n /**\n * Sends a sync request to Locus for the specified data set.\n *\n * @param {InternalDataSet} dataSet The data set to sync.\n * @param {Record<number, LeafDataItem[]>} mismatchedLeavesData The mismatched leaves data to include in the sync request.\n * @returns {Promise<HashTreeMessage|null>}\n */\n private sendSyncRequestToLocus(\n dataSet: InternalDataSet,\n mismatchedLeavesData: Record<number, LeafDataItem[]>\n ): Promise<HashTreeMessage | null> {\n LoggerProxy.logger.info(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Sending sync request for data set \"${dataSet.name}\"`\n );\n\n const url = `${dataSet.url}/sync`;\n const body = {\n dataSet: {\n name: dataSet.name,\n leafCount: dataSet.leafCount,\n root: dataSet.hashTree?.getRootHash(),\n },\n leafDataEntries: [],\n };\n\n Object.keys(mismatchedLeavesData).forEach((index) => {\n body.leafDataEntries.push({\n leafIndex: parseInt(index, 10),\n elementIds: mismatchedLeavesData[index],\n });\n });\n\n return this.webexRequest({\n method: HTTP_VERBS.POST,\n uri: url,\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 throw error;\n });\n }\n}\n\nexport default HashTreeParser;\n"],"mappings":"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","ignoreList":[]}
@@ -1,15 +1,22 @@
1
1
  "use strict";
2
2
 
3
3
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
4
5
  _Object$defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
- exports.ObjectType = void 0;
8
- // todo: Locus docs have now more types like CONTROL_ENTRY, EMBEDDED_APP, FULL_STATE, INFO, MEDIA_SHARE - need to add support for them once Locus implements them
8
+ exports.ObjectTypeToLocusKeyMap = exports.ObjectType = void 0;
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
10
+ // todo: Locus docs have now more types like CONTROL_ENTRY, EMBEDDED_APP - need to add support for them once Locus implements them
9
11
  var ObjectType = exports.ObjectType = {
10
12
  participant: 'participant',
11
13
  self: 'self',
12
14
  locus: 'locus',
13
- mediaShare: 'mediashare'
15
+ mediaShare: 'mediashare',
16
+ info: 'info',
17
+ fullState: 'fullstate',
18
+ links: 'links'
14
19
  };
20
+ // mapping from ObjectType to top level LocusDTO keys
21
+ var ObjectTypeToLocusKeyMap = exports.ObjectTypeToLocusKeyMap = (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, ObjectType.links, 'links'), ObjectType.info, 'info'), ObjectType.fullState, 'fullState'), ObjectType.self, 'self'), ObjectType.participant, 'participants'), ObjectType.mediaShare, 'mediaShares');
15
22
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ObjectType","exports","participant","self","locus","mediaShare"],"sources":["types.ts"],"sourcesContent":["import {Enum} from '../constants';\n\n// todo: Locus docs have now more types like CONTROL_ENTRY, EMBEDDED_APP, FULL_STATE, INFO, MEDIA_SHARE - need to add support for them once Locus implements them\nexport const ObjectType = {\n participant: 'participant',\n self: 'self',\n locus: 'locus',\n mediaShare: 'mediashare',\n} as const;\n\nexport type ObjectType = Enum<typeof ObjectType>;\n\nexport interface HtMeta {\n elementId: {\n type: ObjectType;\n id: number;\n version: number;\n };\n dataSetNames: string[];\n}\n"],"mappings":";;;;;;;AAEA;AACO,IAAMA,UAAU,GAAAC,OAAA,CAAAD,UAAA,GAAG;EACxBE,WAAW,EAAE,aAAa;EAC1BC,IAAI,EAAE,MAAM;EACZC,KAAK,EAAE,OAAO;EACdC,UAAU,EAAE;AACd,CAAU","ignoreList":[]}
1
+ {"version":3,"names":["ObjectType","exports","participant","self","locus","mediaShare","info","fullState","links","ObjectTypeToLocusKeyMap","_defineProperty2","default"],"sources":["types.ts"],"sourcesContent":["import {Enum} from '../constants';\n\n// todo: Locus docs have now more types like CONTROL_ENTRY, EMBEDDED_APP - need to add support for them once Locus implements them\nexport const ObjectType = {\n participant: 'participant',\n self: 'self',\n locus: 'locus',\n mediaShare: 'mediashare',\n info: 'info',\n fullState: 'fullstate',\n links: 'links',\n} as const;\n\nexport type ObjectType = Enum<typeof ObjectType>;\n\n// mapping from ObjectType to top level LocusDTO keys\nexport const ObjectTypeToLocusKeyMap = {\n [ObjectType.links]: 'links',\n [ObjectType.info]: 'info',\n [ObjectType.fullState]: 'fullState',\n [ObjectType.self]: 'self',\n [ObjectType.participant]: 'participants', // note: each object is a single participant in participants array\n [ObjectType.mediaShare]: 'mediaShares', // note: each object is a single mediaShare in mediaShares array\n};\nexport interface HtMeta {\n elementId: {\n type: ObjectType;\n id: number;\n version: number;\n };\n dataSetNames: string[];\n}\n"],"mappings":";;;;;;;;;AAEA;AACO,IAAMA,UAAU,GAAAC,OAAA,CAAAD,UAAA,GAAG;EACxBE,WAAW,EAAE,aAAa;EAC1BC,IAAI,EAAE,MAAM;EACZC,KAAK,EAAE,OAAO;EACdC,UAAU,EAAE,YAAY;EACxBC,IAAI,EAAE,MAAM;EACZC,SAAS,EAAE,WAAW;EACtBC,KAAK,EAAE;AACT,CAAU;AAIV;AACO,IAAMC,uBAAuB,GAAAR,OAAA,CAAAQ,uBAAA,OAAAC,gBAAA,CAAAC,OAAA,MAAAD,gBAAA,CAAAC,OAAA,MAAAD,gBAAA,CAAAC,OAAA,MAAAD,gBAAA,CAAAC,OAAA,MAAAD,gBAAA,CAAAC,OAAA,MAAAD,gBAAA,CAAAC,OAAA,MACjCX,UAAU,CAACQ,KAAK,EAAG,OAAO,GAC1BR,UAAU,CAACM,IAAI,EAAG,MAAM,GACxBN,UAAU,CAACO,SAAS,EAAG,WAAW,GAClCP,UAAU,CAACG,IAAI,EAAG,MAAM,GACxBH,UAAU,CAACE,WAAW,EAAG,cAAc,GACvCF,UAAU,CAACK,UAAU,EAAG,aAAa,CACvC","ignoreList":[]}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.deleteNestedObjectsWithHtMeta = void 0;
9
+ var _isArray = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/is-array"));
10
+ var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
11
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/typeof"));
12
+ /* eslint-disable import/prefer-default-export */
13
+
14
+ /**
15
+ * Analyzes given part of Locus DTO recursively and delete any nested objects that have their own htMeta
16
+ *
17
+ * @param {Object} currentLocusPart part of locus DTO to analyze
18
+ * @param {Object} parent parent object
19
+ * @param {string|number} currentKey key of the parent object that currentLocusPart is
20
+ * @returns {void}
21
+ */
22
+ var _deleteNestedObjectsWithHtMeta = exports.deleteNestedObjectsWithHtMeta = function deleteNestedObjectsWithHtMeta(currentLocusPart, parent, currentKey) {
23
+ if ((0, _typeof2.default)(currentLocusPart) !== 'object' || currentLocusPart === null) {
24
+ return;
25
+ }
26
+ if (parent && currentKey !== undefined && currentLocusPart.htMeta) {
27
+ if ((0, _isArray.default)(parent)) {
28
+ parent.splice(Number(currentKey), 1);
29
+ } else {
30
+ delete parent[currentKey];
31
+ }
32
+ return;
33
+ }
34
+ if ((0, _isArray.default)(currentLocusPart)) {
35
+ // iterate array in reverse, so that indexes remain valid when deleting elements
36
+ for (var i = currentLocusPart.length - 1; i >= 0; i -= 1) {
37
+ _deleteNestedObjectsWithHtMeta(currentLocusPart[i], currentLocusPart, i);
38
+ }
39
+ } else {
40
+ for (var _i = 0, _Object$keys = (0, _keys.default)(currentLocusPart); _i < _Object$keys.length; _i++) {
41
+ var key = _Object$keys[_i];
42
+ if (Object.prototype.hasOwnProperty.call(currentLocusPart, key)) {
43
+ _deleteNestedObjectsWithHtMeta(currentLocusPart[key], currentLocusPart, key);
44
+ }
45
+ }
46
+ }
47
+ };
48
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["deleteNestedObjectsWithHtMeta","exports","currentLocusPart","parent","currentKey","_typeof2","default","undefined","htMeta","_isArray","splice","Number","i","length","_i","_Object$keys","_keys","key","Object","prototype","hasOwnProperty","call"],"sources":["utils.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\n\n/**\n * Analyzes given part of Locus DTO recursively and delete any nested objects that have their own htMeta\n *\n * @param {Object} currentLocusPart part of locus DTO to analyze\n * @param {Object} parent parent object\n * @param {string|number} currentKey key of the parent object that currentLocusPart is\n * @returns {void}\n */\nexport const deleteNestedObjectsWithHtMeta = (\n currentLocusPart: any,\n parent?: any,\n currentKey?: string | number\n) => {\n if (typeof currentLocusPart !== 'object' || currentLocusPart === null) {\n return;\n }\n\n if (parent && currentKey !== undefined && currentLocusPart.htMeta) {\n if (Array.isArray(parent)) {\n parent.splice(Number(currentKey), 1);\n } else {\n delete parent[currentKey];\n }\n\n return;\n }\n\n if (Array.isArray(currentLocusPart)) {\n // iterate array in reverse, so that indexes remain valid when deleting elements\n for (let i = currentLocusPart.length - 1; i >= 0; i -= 1) {\n deleteNestedObjectsWithHtMeta(currentLocusPart[i], currentLocusPart, i);\n }\n } else {\n for (const key of Object.keys(currentLocusPart)) {\n if (Object.prototype.hasOwnProperty.call(currentLocusPart, key)) {\n deleteNestedObjectsWithHtMeta(currentLocusPart[key], currentLocusPart, key);\n }\n }\n }\n};\n"],"mappings":";;;;;;;;;;;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,IAAMA,8BAA6B,GAAAC,OAAA,CAAAD,6BAAA,GAAG,SAAhCA,6BAA6BA,CACxCE,gBAAqB,EACrBC,MAAY,EACZC,UAA4B,EACzB;EACH,IAAI,IAAAC,QAAA,CAAAC,OAAA,EAAOJ,gBAAgB,MAAK,QAAQ,IAAIA,gBAAgB,KAAK,IAAI,EAAE;IACrE;EACF;EAEA,IAAIC,MAAM,IAAIC,UAAU,KAAKG,SAAS,IAAIL,gBAAgB,CAACM,MAAM,EAAE;IACjE,IAAI,IAAAC,QAAA,CAAAH,OAAA,EAAcH,MAAM,CAAC,EAAE;MACzBA,MAAM,CAACO,MAAM,CAACC,MAAM,CAACP,UAAU,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC,MAAM;MACL,OAAOD,MAAM,CAACC,UAAU,CAAC;IAC3B;IAEA;EACF;EAEA,IAAI,IAAAK,QAAA,CAAAH,OAAA,EAAcJ,gBAAgB,CAAC,EAAE;IACnC;IACA,KAAK,IAAIU,CAAC,GAAGV,gBAAgB,CAACW,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,IAAI,CAAC,EAAE;MACxDZ,8BAA6B,CAACE,gBAAgB,CAACU,CAAC,CAAC,EAAEV,gBAAgB,EAAEU,CAAC,CAAC;IACzE;EACF,CAAC,MAAM;IACL,SAAAE,EAAA,MAAAC,YAAA,GAAkB,IAAAC,KAAA,CAAAV,OAAA,EAAYJ,gBAAgB,CAAC,EAAAY,EAAA,GAAAC,YAAA,CAAAF,MAAA,EAAAC,EAAA,IAAE;MAA5C,IAAMG,GAAG,GAAAF,YAAA,CAAAD,EAAA;MACZ,IAAII,MAAM,CAACC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACnB,gBAAgB,EAAEe,GAAG,CAAC,EAAE;QAC/DjB,8BAA6B,CAACE,gBAAgB,CAACe,GAAG,CAAC,EAAEf,gBAAgB,EAAEe,GAAG,CAAC;MAC7E;IACF;EACF;AACF,CAAC","ignoreList":[]}
@@ -372,7 +372,7 @@ var SimultaneousInterpretation = _webexCore.WebexPlugin.extend({
372
372
  throw error;
373
373
  });
374
374
  },
375
- version: "3.10.0-next.14"
375
+ version: "3.10.0-next.16"
376
376
  });
377
377
  var _default = exports.default = SimultaneousInterpretation;
378
378
  //# sourceMappingURL=index.js.map
@@ -18,7 +18,7 @@ var SILanguage = _webexCore.WebexPlugin.extend({
18
18
  languageCode: 'number',
19
19
  languageName: 'string'
20
20
  },
21
- version: "3.10.0-next.14"
21
+ version: "3.10.0-next.16"
22
22
  });
23
23
  var _default = exports.default = SILanguage;
24
24
  //# sourceMappingURL=siLanguage.js.map
@@ -20,6 +20,7 @@ _Object$defineProperty(exports, "__esModule", {
20
20
  exports.default = void 0;
21
21
  var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
22
22
  var _map = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/map"));
23
+ var _values = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/values"));
23
24
  var _assign = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/assign"));
24
25
  var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
25
26
  var _isArray = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/is-array"));
@@ -54,6 +55,8 @@ function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymb
54
55
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
55
56
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
56
57
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
58
+ // list of top level keys in Locus DTO relevant for Hash Tree DTOs processing
59
+ // it does not contain fields specific to classic Locus DTOs like sequence or baseSequence
57
60
  var LocusDtoTopLevelKeys = ['controls', 'fullState', 'host', 'info', 'links', 'mediaShares', 'meetings', 'participants', 'replaces', 'self', 'sequence', 'syncUrl', 'url', 'htMeta' // only exists when hash trees are used
58
61
  ];
59
62
  var LocusObjectStateAfterUpdates = {
@@ -106,8 +109,7 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
106
109
  (0, _defineProperty2.default)(_this, "mediaShares", void 0);
107
110
  (0, _defineProperty2.default)(_this, "replace", void 0);
108
111
  (0, _defineProperty2.default)(_this, "url", void 0);
109
- (0, _defineProperty2.default)(_this, "services", void 0);
110
- (0, _defineProperty2.default)(_this, "resources", void 0);
112
+ (0, _defineProperty2.default)(_this, "links", void 0);
111
113
  (0, _defineProperty2.default)(_this, "mainSessionLocusCache", void 0);
112
114
  (0, _defineProperty2.default)(_this, "self", void 0);
113
115
  (0, _defineProperty2.default)(_this, "hashTreeParser", void 0);
@@ -296,7 +298,6 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
296
298
  }, {
297
299
  key: "init",
298
300
  value: function init() {
299
- var _locus$links, _locus$links2;
300
301
  var locus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
301
302
  this.created = locus.created || null;
302
303
  this.scheduledMeeting = locus.meeting || null;
@@ -332,8 +333,7 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
332
333
  this.updateSelf(locus.self);
333
334
  this.updateHostInfo(locus.host);
334
335
  this.updateMediaShares(locus.mediaShares);
335
- this.updateServices((_locus$links = locus.links) === null || _locus$links === void 0 ? void 0 : _locus$links.services);
336
- this.updateResources((_locus$links2 = locus.links) === null || _locus$links2 === void 0 ? void 0 : _locus$links2.resources);
336
+ this.updateLinks(locus.links);
337
337
  }
338
338
 
339
339
  /**
@@ -471,10 +471,13 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
471
471
  key: "handleLocusAPIResponse",
472
472
  value: function handleLocusAPIResponse(meeting, responseBody) {
473
473
  if (this.hashTreeParser) {
474
- // API responses with hash tree are a bit problematic and not fully confirmed how they will look like
475
- // we don't really need them, because all updates are guaranteed to come via Mercury or LLM messages anyway
476
- // so it's OK to skip them for now
477
- _loggerProxy.default.logger.info('Locus-info:index#handleLocusAPIResponse: skipping handling of API http response with hashTreeParser');
474
+ if (!responseBody.dataSets) {
475
+ this.sendClassicVsHashTreeMismatchMetric(meeting, "expected hash tree dataSets in API response but they are missing");
476
+ // continuing as we can still manage without responseBody.dataSets, but this is very suspicious
477
+ }
478
+ _loggerProxy.default.logger.info('Locus-info:index#handleLocusAPIResponse --> passing Locus API response to HashTreeParser: ', responseBody);
479
+ // update the data in our hash trees
480
+ this.hashTreeParser.handleLocusUpdate(responseBody);
478
481
  } else {
479
482
  if (responseBody.dataSets) {
480
483
  this.sendClassicVsHashTreeMismatchMetric(meeting, "unexpected hash tree dataSets in API response");
@@ -500,25 +503,26 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
500
503
  if (!object.data) {
501
504
  // not doing anything here, as we need Locus to always be there (at least some fields)
502
505
  // and that's already taken care of in updateFromHashTree()
503
- _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> LOCUS object removed");
506
+ _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> LOCUS object removed, version=".concat(object.htMeta.elementId.version));
504
507
  return locus;
505
508
  }
506
509
  // replace the main locus
507
510
 
508
- // The Locus object we receive from backend has empty participants, so removing them to avoid it overriding the ones in our current locus object
509
- // Also, other fields like mediaShares are managed by other ObjectType updates, so removing them too
510
- // BTW, it also doesn't have "self". That's OK as it won't override existing locus.self and also existing SDK code can handle that missing self in Locus updates
511
+ // The Locus object we receive from backend has empty participants array,
512
+ // and may have (although it shouldn't) other fields that are managed by other ObjectTypes
513
+ // like "fullState" or "info", so we're making sure to delete them here
511
514
  var locusObjectFromData = object.data;
512
- delete locusObjectFromData.participants;
513
- delete locusObjectFromData.mediaShares;
515
+ (0, _values.default)(_types.ObjectTypeToLocusKeyMap).forEach(function (locusDtoKey) {
516
+ delete locusObjectFromData[locusDtoKey];
517
+ });
514
518
  locus = _objectSpread(_objectSpread({}, locus), locusObjectFromData);
515
- _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> LOCUS object updated");
519
+ _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> LOCUS object updated to version=".concat(object.htMeta.elementId.version));
516
520
  break;
517
521
  }
518
522
  case _types.ObjectType.mediaShare:
519
523
  if (object.data) {
520
524
  var _object$data$floor, _object$data$floor2, _object$data$floor2$b, _locus$mediaShares;
521
- _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> mediaShare id=".concat(object.htMeta.elementId.id, " name='").concat(object.data.name, "' updated ").concat(object.data.name === 'content' ? "floor=".concat((_object$data$floor = object.data.floor) === null || _object$data$floor === void 0 ? void 0 : _object$data$floor.disposition, ", ").concat((_object$data$floor2 = object.data.floor) === null || _object$data$floor2 === void 0 ? void 0 : (_object$data$floor2$b = _object$data$floor2.beneficiary) === null || _object$data$floor2$b === void 0 ? void 0 : _object$data$floor2$b.id) : ''));
525
+ _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> mediaShare id=".concat(object.htMeta.elementId.id, " name='").concat(object.data.name, "' updated ").concat(object.data.name === 'content' ? "floor=".concat((_object$data$floor = object.data.floor) === null || _object$data$floor === void 0 ? void 0 : _object$data$floor.disposition, ", ").concat((_object$data$floor2 = object.data.floor) === null || _object$data$floor2 === void 0 ? void 0 : (_object$data$floor2$b = _object$data$floor2.beneficiary) === null || _object$data$floor2$b === void 0 ? void 0 : _object$data$floor2$b.id) : '', " version=").concat(object.htMeta.elementId.version));
522
526
  var existingMediaShare = (_locus$mediaShares = locus.mediaShares) === null || _locus$mediaShares === void 0 ? void 0 : _locus$mediaShares.find(function (ms) {
523
527
  return ms.htMeta.elementId.id === object.htMeta.elementId.id;
524
528
  });
@@ -530,14 +534,14 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
530
534
  }
531
535
  } else {
532
536
  var _locus$mediaShares2;
533
- _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> mediaShare id=".concat(object.htMeta.elementId.id, " removed"));
537
+ _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> mediaShare id=".concat(object.htMeta.elementId.id, " removed, version=").concat(object.htMeta.elementId.version));
534
538
  locus.mediaShares = (_locus$mediaShares2 = locus.mediaShares) === null || _locus$mediaShares2 === void 0 ? void 0 : _locus$mediaShares2.filter(function (ms) {
535
539
  return ms.htMeta.elementId.id !== object.htMeta.elementId.id;
536
540
  });
537
541
  }
538
542
  break;
539
543
  case _types.ObjectType.participant:
540
- _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> participant id=".concat(object.htMeta.elementId.id, " ").concat(object.data ? 'updated' : 'removed'));
544
+ _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> participant id=".concat(object.htMeta.elementId.id, " ").concat(object.data ? 'updated' : 'removed', " version=").concat(object.htMeta.elementId.version));
541
545
  if (object.data) {
542
546
  if (!locus.participants) {
543
547
  locus.participants = [];
@@ -557,14 +561,19 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
557
561
  this.hashTreeObjectId2ParticipantId.delete(object.htMeta.elementId.id);
558
562
  }
559
563
  break;
564
+ case _types.ObjectType.links:
565
+ case _types.ObjectType.info:
566
+ case _types.ObjectType.fullState:
560
567
  case _types.ObjectType.self:
561
568
  if (!object.data) {
562
569
  // self without data is handled inside HashTreeParser and results in LocusInfoUpdateType.MEETING_ENDED, so we should never get here
563
- _loggerProxy.default.logger.warn("Locus-info:index#updateLocusFromHashTreeObject --> received SELF object without data, this is not expected!");
564
- return locus;
570
+ // all other types info, fullstate, etc - Locus should never send them without data
571
+ _loggerProxy.default.logger.warn("Locus-info:index#updateLocusFromHashTreeObject --> received ".concat(type, " object without data, this is not expected! version=").concat(object.htMeta.elementId.version));
572
+ } else {
573
+ _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> ".concat(type, " object updated to version ").concat(object.htMeta.elementId.version));
574
+ var locusDtoKey = _types.ObjectTypeToLocusKeyMap[type];
575
+ locus[locusDtoKey] = object.data;
565
576
  }
566
- _loggerProxy.default.logger.info("Locus-info:index#updateLocusFromHashTreeObject --> SELF object updated");
567
- locus.self = object.data;
568
577
  break;
569
578
  default:
570
579
  _loggerProxy.default.logger.warn("Locus-info:index#updateLocusFromHashTreeObject --> received unsupported object type ".concat(type));
@@ -661,22 +670,30 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
661
670
 
662
671
  // if Locus object is unchanged or removed, we need to keep using the existing locus
663
672
  // because the rest of the locusInfo code expects locus to always be present (with at least some of the fields)
664
- // if it gets updated, we don't need to do anything and we start with an empty one
665
- // so that when it gets updated, if the new one is missing some field, that field will
673
+ // if it gets updated, we only need to have the fields that are not part of "locus" object (like "info" or "mediaShares")
674
+ // so that when Locus object gets updated, if the new one is missing some field, that field will
666
675
  // be removed from our locusInfo
667
676
  if (locusObjectStateAfterUpdates === LocusObjectStateAfterUpdates.unchanged || locusObjectStateAfterUpdates === LocusObjectStateAfterUpdates.removed) {
668
- // copy over existing locus
677
+ // copy over all of existing locus except participants
669
678
  LocusDtoTopLevelKeys.forEach(function (key) {
670
679
  if (key !== 'participants') {
671
680
  locus[key] = (0, _lodash.cloneDeep)(_this4[key]);
672
681
  }
673
682
  });
683
+ } else {
684
+ // initialize only the fields that are not part of main "Locus" object
685
+ // (except participants, which need to stay empty - that means "no participant changes")
686
+ (0, _values.default)(_types.ObjectTypeToLocusKeyMap).forEach(function (locusDtoKey) {
687
+ if (locusDtoKey !== 'participants') {
688
+ locus[locusDtoKey] = (0, _lodash.cloneDeep)(_this4[locusDtoKey]);
689
+ }
690
+ });
674
691
  }
675
692
  _loggerProxy.default.logger.info("Locus-info:index#updateFromHashTree --> LOCUS object is ".concat(locusObjectStateAfterUpdates, ", all updates: ").concat((0, _stringify.default)(data.updatedObjects.map(function (o) {
676
693
  return {
677
694
  type: o.htMeta.elementId.type,
678
695
  id: o.htMeta.elementId.id,
679
- hasData: o.data !== undefined
696
+ hasData: !!o.data
680
697
  };
681
698
  }))));
682
699
  // now apply all the updates from the hash tree onto the locus
@@ -923,7 +940,7 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
923
940
  }, {
924
941
  key: "updateLocusInfo",
925
942
  value: function updateLocusInfo(locus) {
926
- var _locus$self, _locus$self2, _locus$links3, _locus$links4;
943
+ var _locus$self, _locus$self2;
927
944
  if (((_locus$self = locus.self) === null || _locus$self === void 0 ? void 0 : _locus$self.reason) === 'MOVED' && ((_locus$self2 = locus.self) === null || _locus$self2 === void 0 ? void 0 : _locus$self2.state) === 'LEFT') {
928
945
  // When moved to a breakout session locus sends a message for the previous locus
929
946
  // indicating that we have been moved. It isn't helpful to continue parsing this
@@ -947,8 +964,7 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
947
964
  this.updateMemberShip(locus.membership);
948
965
  this.updateIdentifiers(locus.identities);
949
966
  this.updateEmbeddedApps(locus.embeddedApps);
950
- this.updateServices((_locus$links3 = locus.links) === null || _locus$links3 === void 0 ? void 0 : _locus$links3.services);
951
- this.updateResources((_locus$links4 = locus.links) === null || _locus$links4 === void 0 ? void 0 : _locus$links4.resources);
967
+ this.updateLinks(locus.links);
952
968
  this.compareAndUpdate();
953
969
  // update which required to compare different objects from locus
954
970
  }
@@ -1497,41 +1513,35 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
1497
1513
  }
1498
1514
 
1499
1515
  /**
1500
- * @param {Object} services
1516
+ * Updates links and emits appropriate events if services or resources have changed
1517
+ * @param {Object} links
1501
1518
  * @returns {undefined}
1502
1519
  * @memberof LocusInfo
1503
1520
  */
1504
1521
  }, {
1505
- key: "updateServices",
1506
- value: function updateServices(services) {
1507
- if (services && !(0, _lodash.isEqual)(this.services, services)) {
1508
- this.services = services;
1522
+ key: "updateLinks",
1523
+ value: function updateLinks(links) {
1524
+ var _this$links, _this$links2;
1525
+ var _ref2 = links || {},
1526
+ services = _ref2.services,
1527
+ resources = _ref2.resources;
1528
+ if (services && !(0, _lodash.isEqual)((_this$links = this.links) === null || _this$links === void 0 ? void 0 : _this$links.services, services)) {
1509
1529
  this.emitScoped({
1510
1530
  file: 'locus-info',
1511
- function: 'updateServices'
1531
+ function: 'updateLinks'
1512
1532
  }, _constants.LOCUSINFO.EVENTS.LINKS_SERVICES, {
1513
1533
  services: services
1514
1534
  });
1515
1535
  }
1516
- }
1517
-
1518
- /**
1519
- * @param {Object} resources
1520
- * @returns {undefined}
1521
- * @memberof LocusInfo
1522
- */
1523
- }, {
1524
- key: "updateResources",
1525
- value: function updateResources(resources) {
1526
- if (resources && !(0, _lodash.isEqual)(this.resources, resources)) {
1527
- this.resources = resources;
1536
+ if (resources && !(0, _lodash.isEqual)((_this$links2 = this.links) === null || _this$links2 === void 0 ? void 0 : _this$links2.resources, resources)) {
1528
1537
  this.emitScoped({
1529
1538
  file: 'locus-info',
1530
- function: 'updateResources'
1539
+ function: 'updateLinks'
1531
1540
  }, _constants.LOCUSINFO.EVENTS.LINKS_RESOURCES, {
1532
1541
  resources: resources
1533
1542
  });
1534
1543
  }
1544
+ this.links = links;
1535
1545
  }
1536
1546
 
1537
1547
  /**