@webex/plugin-meetings 3.11.0 → 3.12.0-next.2

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 (170) hide show
  1. package/dist/aiEnableRequest/index.js +184 -0
  2. package/dist/aiEnableRequest/index.js.map +1 -0
  3. package/dist/aiEnableRequest/utils.js +36 -0
  4. package/dist/aiEnableRequest/utils.js.map +1 -0
  5. package/dist/annotation/index.js +14 -5
  6. package/dist/annotation/index.js.map +1 -1
  7. package/dist/breakouts/breakout.js +1 -1
  8. package/dist/breakouts/index.js +1 -1
  9. package/dist/config.js +7 -2
  10. package/dist/config.js.map +1 -1
  11. package/dist/constants.js +28 -6
  12. package/dist/constants.js.map +1 -1
  13. package/dist/hashTree/constants.js +3 -1
  14. package/dist/hashTree/constants.js.map +1 -1
  15. package/dist/hashTree/hashTree.js +18 -0
  16. package/dist/hashTree/hashTree.js.map +1 -1
  17. package/dist/hashTree/hashTreeParser.js +850 -410
  18. package/dist/hashTree/hashTreeParser.js.map +1 -1
  19. package/dist/hashTree/types.js +4 -2
  20. package/dist/hashTree/types.js.map +1 -1
  21. package/dist/hashTree/utils.js +10 -0
  22. package/dist/hashTree/utils.js.map +1 -1
  23. package/dist/index.js +11 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/interceptors/constant.js +12 -0
  26. package/dist/interceptors/constant.js.map +1 -0
  27. package/dist/interceptors/dataChannelAuthToken.js +290 -0
  28. package/dist/interceptors/dataChannelAuthToken.js.map +1 -0
  29. package/dist/interceptors/index.js +7 -0
  30. package/dist/interceptors/index.js.map +1 -1
  31. package/dist/interceptors/utils.js +27 -0
  32. package/dist/interceptors/utils.js.map +1 -0
  33. package/dist/interpretation/index.js +2 -2
  34. package/dist/interpretation/index.js.map +1 -1
  35. package/dist/interpretation/siLanguage.js +1 -1
  36. package/dist/locus-info/controlsUtils.js +5 -3
  37. package/dist/locus-info/controlsUtils.js.map +1 -1
  38. package/dist/locus-info/index.js +522 -131
  39. package/dist/locus-info/index.js.map +1 -1
  40. package/dist/locus-info/selfUtils.js +1 -0
  41. package/dist/locus-info/selfUtils.js.map +1 -1
  42. package/dist/locus-info/types.js.map +1 -1
  43. package/dist/media/MediaConnectionAwaiter.js +57 -1
  44. package/dist/media/MediaConnectionAwaiter.js.map +1 -1
  45. package/dist/media/properties.js +4 -2
  46. package/dist/media/properties.js.map +1 -1
  47. package/dist/meeting/in-meeting-actions.js +7 -1
  48. package/dist/meeting/in-meeting-actions.js.map +1 -1
  49. package/dist/meeting/index.js +1173 -877
  50. package/dist/meeting/index.js.map +1 -1
  51. package/dist/meeting/request.js +50 -0
  52. package/dist/meeting/request.js.map +1 -1
  53. package/dist/meeting/request.type.js.map +1 -1
  54. package/dist/meeting/util.js +133 -3
  55. package/dist/meeting/util.js.map +1 -1
  56. package/dist/meetings/index.js +117 -48
  57. package/dist/meetings/index.js.map +1 -1
  58. package/dist/member/index.js +10 -0
  59. package/dist/member/index.js.map +1 -1
  60. package/dist/member/util.js +10 -0
  61. package/dist/member/util.js.map +1 -1
  62. package/dist/metrics/constants.js +2 -1
  63. package/dist/metrics/constants.js.map +1 -1
  64. package/dist/multistream/mediaRequestManager.js +9 -60
  65. package/dist/multistream/mediaRequestManager.js.map +1 -1
  66. package/dist/multistream/remoteMediaManager.js +11 -0
  67. package/dist/multistream/remoteMediaManager.js.map +1 -1
  68. package/dist/reachability/index.js +18 -10
  69. package/dist/reachability/index.js.map +1 -1
  70. package/dist/reactions/reactions.type.js.map +1 -1
  71. package/dist/reconnection-manager/index.js +0 -1
  72. package/dist/reconnection-manager/index.js.map +1 -1
  73. package/dist/types/aiEnableRequest/index.d.ts +5 -0
  74. package/dist/types/aiEnableRequest/utils.d.ts +2 -0
  75. package/dist/types/config.d.ts +4 -0
  76. package/dist/types/constants.d.ts +23 -1
  77. package/dist/types/hashTree/constants.d.ts +1 -0
  78. package/dist/types/hashTree/hashTree.d.ts +7 -0
  79. package/dist/types/hashTree/hashTreeParser.d.ts +122 -14
  80. package/dist/types/hashTree/types.d.ts +3 -0
  81. package/dist/types/hashTree/utils.d.ts +6 -0
  82. package/dist/types/index.d.ts +1 -0
  83. package/dist/types/interceptors/constant.d.ts +5 -0
  84. package/dist/types/interceptors/dataChannelAuthToken.d.ts +43 -0
  85. package/dist/types/interceptors/index.d.ts +2 -1
  86. package/dist/types/interceptors/utils.d.ts +1 -0
  87. package/dist/types/locus-info/index.d.ts +60 -8
  88. package/dist/types/locus-info/types.d.ts +7 -0
  89. package/dist/types/media/MediaConnectionAwaiter.d.ts +10 -1
  90. package/dist/types/media/properties.d.ts +2 -1
  91. package/dist/types/meeting/in-meeting-actions.d.ts +6 -0
  92. package/dist/types/meeting/index.d.ts +61 -7
  93. package/dist/types/meeting/request.d.ts +16 -1
  94. package/dist/types/meeting/request.type.d.ts +5 -0
  95. package/dist/types/meeting/util.d.ts +31 -0
  96. package/dist/types/meetings/index.d.ts +4 -2
  97. package/dist/types/member/index.d.ts +1 -0
  98. package/dist/types/member/util.d.ts +5 -0
  99. package/dist/types/metrics/constants.d.ts +1 -0
  100. package/dist/types/multistream/mediaRequestManager.d.ts +0 -23
  101. package/dist/types/reactions/reactions.type.d.ts +1 -0
  102. package/dist/types/webinar/utils.d.ts +6 -0
  103. package/dist/webinar/index.js +291 -91
  104. package/dist/webinar/index.js.map +1 -1
  105. package/dist/webinar/utils.js +25 -0
  106. package/dist/webinar/utils.js.map +1 -0
  107. package/package.json +24 -23
  108. package/src/aiEnableRequest/README.md +84 -0
  109. package/src/aiEnableRequest/index.ts +170 -0
  110. package/src/aiEnableRequest/utils.ts +25 -0
  111. package/src/annotation/index.ts +27 -7
  112. package/src/config.ts +4 -0
  113. package/src/constants.ts +29 -1
  114. package/src/hashTree/constants.ts +1 -0
  115. package/src/hashTree/hashTree.ts +17 -0
  116. package/src/hashTree/hashTreeParser.ts +745 -252
  117. package/src/hashTree/types.ts +4 -0
  118. package/src/hashTree/utils.ts +9 -0
  119. package/src/index.ts +8 -1
  120. package/src/interceptors/constant.ts +6 -0
  121. package/src/interceptors/dataChannelAuthToken.ts +170 -0
  122. package/src/interceptors/index.ts +2 -1
  123. package/src/interceptors/utils.ts +16 -0
  124. package/src/interpretation/index.ts +2 -2
  125. package/src/locus-info/controlsUtils.ts +11 -0
  126. package/src/locus-info/index.ts +579 -113
  127. package/src/locus-info/selfUtils.ts +1 -0
  128. package/src/locus-info/types.ts +8 -0
  129. package/src/media/MediaConnectionAwaiter.ts +41 -1
  130. package/src/media/properties.ts +3 -1
  131. package/src/meeting/in-meeting-actions.ts +12 -0
  132. package/src/meeting/index.ts +291 -76
  133. package/src/meeting/request.ts +42 -0
  134. package/src/meeting/request.type.ts +6 -0
  135. package/src/meeting/util.ts +160 -2
  136. package/src/meetings/index.ts +157 -44
  137. package/src/member/index.ts +10 -0
  138. package/src/member/util.ts +12 -0
  139. package/src/metrics/constants.ts +1 -0
  140. package/src/multistream/mediaRequestManager.ts +4 -54
  141. package/src/multistream/remoteMediaManager.ts +13 -0
  142. package/src/reachability/index.ts +9 -0
  143. package/src/reactions/reactions.type.ts +1 -0
  144. package/src/reconnection-manager/index.ts +0 -1
  145. package/src/webinar/index.ts +191 -6
  146. package/src/webinar/utils.ts +16 -0
  147. package/test/unit/spec/aiEnableRequest/index.ts +981 -0
  148. package/test/unit/spec/aiEnableRequest/utils.ts +130 -0
  149. package/test/unit/spec/annotation/index.ts +69 -7
  150. package/test/unit/spec/hashTree/hashTree.ts +66 -0
  151. package/test/unit/spec/hashTree/hashTreeParser.ts +2225 -189
  152. package/test/unit/spec/interceptors/dataChannelAuthToken.ts +210 -0
  153. package/test/unit/spec/interceptors/utils.ts +75 -0
  154. package/test/unit/spec/locus-info/controlsUtils.js +29 -0
  155. package/test/unit/spec/locus-info/index.js +1134 -55
  156. package/test/unit/spec/media/MediaConnectionAwaiter.ts +41 -1
  157. package/test/unit/spec/media/properties.ts +12 -3
  158. package/test/unit/spec/meeting/in-meeting-actions.ts +8 -2
  159. package/test/unit/spec/meeting/index.js +829 -115
  160. package/test/unit/spec/meeting/request.js +70 -0
  161. package/test/unit/spec/meeting/utils.js +438 -26
  162. package/test/unit/spec/meetings/index.js +653 -32
  163. package/test/unit/spec/member/index.js +28 -4
  164. package/test/unit/spec/member/util.js +65 -27
  165. package/test/unit/spec/multistream/mediaRequestManager.ts +2 -85
  166. package/test/unit/spec/multistream/remoteMediaManager.ts +30 -0
  167. package/test/unit/spec/reachability/index.ts +23 -0
  168. package/test/unit/spec/reconnection-manager/index.js +4 -8
  169. package/test/unit/spec/webinar/index.ts +474 -37
  170. package/test/unit/spec/webinar/utils.ts +39 -0
@@ -1 +1 @@
1
- {"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_triggerProxy","_constants","_constants2","_reconnection","_reconnectionNotStarted","_metrics","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","NeedsRetryError","_Error","_classCallCheck2","arguments","_inherits2","_createClass2","_wrapNativeSuper2","Error","NeedsRejoinError","_Error2","_ref","_this","wasSharing","_ref$error","error","_defineProperty2","ReconnectionManager","exports","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","key","value","resetReconnectionTimer","clearTimeout","iceReconnected","LoggerProxy","logger","log","waitForIceReconnect","_this2","_promise","reject","setTimeout","concat","cleanUp","_stopLocalShareStream","_asyncToGenerator2","_regenerator","mark","_callee","reason","wrap","_context","prev","next","unpublishStreams","mediaProperties","shareVideoStream","shareAudioStream","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","stop","stopLocalShareStream","_x","isReconnectInProgress","IN_PROGRESS","canStartReconnection","enabled","info","_reconnect","_callee2","_this3","_ref2","_ref2$networkDisconne","networkDisconnect","_ref2$networkRetry","networkRetry","completionCallback","triggerEvent","_args2","_t","_t2","_t3","_context2","length","id","event","payload","ReconnectionNotStartedError","MEETING_RECONNECTION_STARTING","internal","newMetrics","submitClientEvent","name","options","meetingId","meetings","startReachability","executeReconnection","reconnect","abrupt","message","errors","category","errorCode","fatal","shownToUser","rejoinMeeting","MEETING_RECONNECTION_SUCCESS","recoveredBy","MEETING_RECONNECTION_FAILURE","ReconnectionError","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETING_RECONNECT_FAILURE","correlation_id","correlationId","locus_id","locusUrl","split","pop","stack","finish","_executeReconnection","_callee3","_ref3","_ref3$networkDisconne","media","_t4","_t5","_t6","_context3","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","SHARE_STOPPED_REASON","MEDIA_RECONNECTION","reconnectMercuryWebSocket","device","url","FAILURE","syncMeetings","keepOnlyLocusMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","sent","_x2","_rejoinMeeting","_callee4","_args4","_t7","_t8","_context4","join","rejoin","MEETING_REJOIN","MEETING_MAX_REJOIN_FAILURE","_reconnectMedia","_callee5","_turnServerResult$tur","turnServerResult","iceServers","_context5","roap","doTurnDiscovery","turnServerInfo","urls","push","username","credential","password","webrtcMediaConnection","isMultistream","_values","mediaRequestManagers","forEach","mediaRequestManager","clearPreviousRequests","commit","_reconnectMercuryWebSocket","_callee6","_t9","_t0","_context6","mercury","connected","disconnect","connect"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable no-warning-comments */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {\n EVENT_TRIGGERS,\n RECONNECTION,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n _CALL_,\n _LEFT_,\n _ID_,\n RECONNECTION_STATE,\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ReconnectionError from '../common/errors/reconnection';\nimport ReconnectionNotStartedError from '../common/errors/reconnection-not-started';\nimport Metrics from '../metrics';\nimport Meeting from '../meeting';\nimport {MediaRequestManager} from '../multistream/mediaRequestManager';\n\n/**\n * Used to indicate that the reconnect logic needs to be retried.\n *\n * @class NeedsRetryError\n * @extends {Error}\n */\nclass NeedsRetryError extends Error {}\n\n/**\n * Used to indicate that the meeting needs to be rejoined, not just media reconnected\n *\n * @class NeedsRejoinError\n * @extends {Error}\n */\nclass NeedsRejoinError extends Error {\n wasSharing: any;\n\n /**\n * Creates an instance of NeedsRejoinError.\n * @param {Object} params\n * @param {boolean} params.wasSharing\n * @param {Error} params.error\n * @memberof NeedsRejoinError\n */\n constructor({\n wasSharing,\n error = new Error('Meeting needs to be rejoined'),\n }: {\n wasSharing?: boolean;\n error?: Error;\n }) {\n // @ts-ignore\n super(error);\n\n this.wasSharing = wasSharing;\n }\n}\n\n/**\n * @export\n * @class ReconnectionManager\n */\nexport default class ReconnectionManager {\n autoRejoinEnabled: any;\n iceState: any;\n maxRejoinAttempts: any;\n meeting: any;\n rejoinAttempts: any;\n shareStatus: any;\n status: any;\n webex: any;\n /**\n * @param {Meeting} meeting\n */\n constructor(meeting: Meeting) {\n /**\n * Stores ICE reconnection state data.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n this.iceState = {\n disconnected: false,\n resolve: () => {},\n timer: undefined,\n // @ts-ignore\n timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout,\n };\n\n /**\n * @instance\n * @type {RECONNECTION_STATE}\n * @private\n * @memberof ReconnectionManager\n */\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO : change this logic to not save the meeting instance\n // It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date\n // @ts-ignore\n this.webex = meeting.webex;\n /**\n * @instance\n * @type {Meeting}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO: try removing the circular dependency for meeting and reconnection manager\n // try moving this to meetings collection\n this.meeting = meeting;\n\n // @ts-ignore\n this.maxRejoinAttempts = meeting.config.reconnection.maxRejoinAttempts;\n this.rejoinAttempts = 0;\n // @ts-ignore\n this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;\n\n // Make sure reconnection state is in default\n this.reset();\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {void}\n */\n resetReconnectionTimer() {\n this.iceState.resolve();\n this.iceState.resolve = () => {};\n\n if (this.iceState.timer) {\n clearTimeout(this.iceState.timer);\n delete this.iceState.timer;\n }\n }\n\n /**\n * Sets the iceState to connected and clears any disconnect timeouts and\n * related timeout data within the iceState.\n *\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public iceReconnected() {\n if (this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#iceReconnected --> ice has reconnected');\n\n this.resetReconnectionTimer();\n\n this.iceState.disconnected = false;\n }\n }\n\n /**\n * Set the iceState to disconnected and generates a timeout that waits for the\n * iceState to reconnect and then resolves. If the ice state is already\n * processing a reconnect, it immediately resolves. Rejects if the timeout\n * duration is reached.\n *\n * @returns {Promise<undefined>}\n * @public\n * @memberof ReconnectionManager\n */\n public waitForIceReconnect() {\n if (!this.iceState.disconnected) {\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect'\n );\n\n this.iceState.disconnected = true;\n\n return new Promise<void>((resolve, reject) => {\n this.iceState.timer = setTimeout(() => {\n if (this.iceState.disconnected === false) {\n resolve();\n } else {\n this.iceState.disconnected = false;\n reject(\n new Error(`ice reconnection did not occur in ${this.iceState.timeoutDuration}ms`)\n );\n }\n }, this.iceState.timeoutDuration);\n\n this.iceState.resolve = resolve;\n });\n }\n\n // return a resolved promise to prevent multiple catch executions of reconnect\n return Promise.resolve();\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public reset() {\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n this.rejoinAttempts = 0;\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public cleanUp() {\n this.reset();\n }\n\n /**\n * Stop the local share stream.\n *\n * @param {string} reason a {@link SHARE_STOPPED_REASON}\n * @returns {undefined}\n * @private\n * @memberof ReconnectionManager\n */\n private async stopLocalShareStream(reason: string) {\n await this.meeting.unpublishStreams([\n this.meeting.mediaProperties.shareVideoStream,\n this.meeting.mediaProperties.shareAudioStream,\n ]);\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'stopLocalShareStream',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n reason,\n }\n );\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {Boolean} true if reconnection operation is in progress\n */\n isReconnectInProgress() {\n return this.status === RECONNECTION.STATE.IN_PROGRESS;\n }\n\n /**\n * @returns {Boolean}\n * @throws {ReconnectInProgress, ReconnectionDisabled}\n * @private\n * @memberof ReconnectionManager\n */\n private canStartReconnection() {\n if (this.meeting.config.reconnection.enabled) {\n if (this.status === RECONNECTION.STATE.DEFAULT_STATUS) {\n return true;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#canStartReconnection --> Reconnection already in progress.'\n );\n\n return false;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#canStartReconnection --> Reconnection is not enabled.'\n );\n\n return false;\n }\n\n /**\n * Initiates a media reconnect for the active meeting\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @param {boolean} [reconnectOptions.networkRetry=false] indicates if we are retrying the reconnect\n * @param {Function} [completionCallback] callback that gets called when reconnection is started successfully\n * @returns {Promise}\n * @public\n * @memberof ReconnectionManager\n */\n public async reconnect(\n {\n networkDisconnect = false,\n networkRetry = false,\n }: {\n networkDisconnect?: boolean;\n networkRetry?: boolean;\n } = {},\n completionCallback: (() => Promise<void>) | undefined = undefined\n ) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`\n );\n\n const triggerEvent = (event, payload = undefined) =>\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'reconnect',\n },\n event,\n payload\n );\n\n if (!this.canStartReconnection()) {\n throw new ReconnectionNotStartedError();\n }\n\n try {\n this.status = RECONNECTION.STATE.IN_PROGRESS;\n\n triggerEvent(EVENT_TRIGGERS.MEETING_RECONNECTION_STARTING);\n\n if (!networkRetry) {\n // Only log START metrics on the initial reconnect\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect start metric.'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.media.reconnecting',\n options: {\n meetingId: this.meeting.id,\n },\n });\n }\n\n try {\n await this.webex.meetings.startReachability('reconnection');\n } catch (err) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reachability failed, continuing with reconnection attempt, err: ',\n err\n );\n }\n\n try {\n await this.executeReconnection({networkDisconnect});\n } catch (reconnectError) {\n if (reconnectError instanceof NeedsRetryError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.'\n );\n // Reset our reconnect status since we are looping back to the beginning\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n\n // This is a network retry, so we should not log START metrics again\n await this.reconnect({networkDisconnect: true, networkRetry: true}, completionCallback);\n\n return;\n }\n\n // Reconnect has failed\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnect --> Reconnection failed.',\n reconnectError.message\n );\n\n // send call aborted event with category as expected as we are trying to rejoin\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.aborted',\n payload: {\n errors: [\n {\n category: 'expected',\n errorCode: 2008,\n fatal: true,\n name: 'media-engine',\n shownToUser: false,\n },\n ],\n },\n options: {\n meetingId: this.meeting.id,\n },\n });\n\n if (reconnectError instanceof NeedsRejoinError && this.autoRejoinEnabled) {\n await this.rejoinMeeting(reconnectError.wasSharing);\n\n return;\n }\n\n throw reconnectError;\n }\n\n // finalize the reconnection process by calling the completionCallback\n if (completionCallback) {\n await completionCallback();\n }\n\n triggerEvent(EVENT_TRIGGERS.MEETING_RECONNECTION_SUCCESS);\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.media.recovered',\n payload: {\n recoveredBy: 'new',\n },\n options: {\n meetingId: this.meeting.id,\n },\n });\n } catch (error) {\n triggerEvent(EVENT_TRIGGERS.MEETING_RECONNECTION_FAILURE, {\n error: new ReconnectionError('Reconnection failure event', error),\n });\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_RECONNECT_FAILURE, {\n correlation_id: this.meeting.correlationId,\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw new ReconnectionError('Reconnection failure event', error);\n } finally {\n this.reset();\n }\n }\n\n /**\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @returns {Promise}\n * @throws {NeedsRetryError}\n * @private\n * @memberof ReconnectionManager\n */\n private async executeReconnection({networkDisconnect = false}: {networkDisconnect?: boolean}) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.'\n );\n\n const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;\n\n if (wasSharing) {\n await this.stopLocalShareStream(SHARE_STOPPED_REASON.MEDIA_RECONNECTION);\n }\n\n if (networkDisconnect) {\n try {\n await this.reconnectMercuryWebSocket();\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Websocket reconnected.',\n this.webex.internal.device.url\n );\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Unable to reconnect to websocket, giving up.'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n throw error;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'\n );\n await this.webex.meetings.syncMeetings({keepOnlyLocusMeetings: false});\n } catch (syncError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.',\n syncError\n );\n throw new NeedsRetryError(syncError);\n }\n\n // TODO: try to improve this logic as the reconnection manager saves the instance of deleted meeting object\n // So that on rejoin it known what parametrs it was using\n if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely.'\n );\n\n throw new Error('Unable to rejoin a meeting already ended or inactive.');\n }\n\n LoggerProxy.logger.info(\n `ReconnectionManager:index#executeReconnection --> Current state of meeting is ${this.meeting.state}`\n );\n\n // If the meeting state was left, no longer reconnect media\n if (this.meeting.state === _LEFT_) {\n if (this.meeting.type === _CALL_) {\n throw new Error('Unable to rejoin a call in LEFT state.');\n }\n\n throw new NeedsRejoinError({wasSharing});\n }\n\n try {\n const media = await this.reconnectMedia();\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#executeReconnection --> webRTC media connection renewed and local sdp offer sent'\n );\n\n return media;\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> failed to renew webRTC media connection or initiate offer'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n\n throw error;\n }\n }\n\n /**\n * Rejoins a meeting after detecting the member was in a LEFT state\n *\n * @async\n * @param {boolean} wasSharing\n * @returns {Promise}\n */\n async rejoinMeeting(wasSharing = false) {\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin'\n );\n\n await this.meeting.join({rejoin: true});\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');\n\n if (wasSharing) {\n await this.stopLocalShareStream(SHARE_STOPPED_REASON.MEETING_REJOIN);\n }\n } catch (joinError) {\n this.rejoinAttempts += 1;\n if (this.rejoinAttempts <= this.maxRejoinAttempts) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting, attempt #${this.rejoinAttempts}, retrying.`,\n joinError\n );\n this.rejoinMeeting();\n } else {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.',\n joinError\n );\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE, {\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: joinError.message,\n stack: joinError.stack,\n });\n this.status = RECONNECTION.STATE.FAILURE;\n throw joinError;\n }\n }\n\n try {\n await this.reconnectMedia();\n } catch (mediaError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to reestablish media after rejoining.',\n mediaError\n );\n throw mediaError;\n }\n }\n\n /**\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n async reconnectMedia() {\n LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> do turn discovery');\n\n // do the TURN server discovery again and ignore reachability results since the TURN server might change\n const turnServerResult = await this.meeting.roap.doTurnDiscovery(this.meeting, true, true);\n\n const iceServers = [];\n\n if (turnServerResult.turnServerInfo?.urls.length > 0) {\n iceServers.push({\n urls: turnServerResult.turnServerInfo.urls,\n username: turnServerResult.turnServerInfo.username || '',\n credential: turnServerResult.turnServerInfo.password || '',\n });\n }\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#reconnectMedia --> renew webRTC media connection and send local sdp offer'\n );\n\n await this.meeting.mediaProperties.webrtcMediaConnection.reconnect(iceServers);\n\n // resend media requests\n if (this.meeting.isMultistream) {\n Object.values(this.meeting.mediaRequestManagers).forEach(\n (mediaRequestManager: MediaRequestManager) => {\n mediaRequestManager.clearPreviousRequests();\n mediaRequestManager.commit();\n }\n );\n }\n }\n\n /**\n * Attempt to Reconnect Mercury Websocket\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n private async reconnectMercuryWebSocket() {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.'\n );\n // First, attempt to disconnect if we think we are already connected.\n if (this.webex.internal.mercury.connected) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Disconnecting existing websocket.'\n );\n try {\n await this.webex.internal.mercury.disconnect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket disconnected successfully.'\n );\n } catch (disconnectError) {\n // If we can't disconnect, the sdk is in such a bad state that reconnecting is not going to happen.\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to disconnect from websocket, giving up.',\n disconnectError\n );\n throw disconnectError;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Connecting websocket.'\n );\n await this.webex.internal.mercury.connect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket connected successfully.'\n );\n } catch (connectError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to connect to websocket, giving up.',\n connectError\n );\n\n throw connectError;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_triggerProxy","_constants","_constants2","_reconnection","_reconnectionNotStarted","_metrics","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","NeedsRetryError","_Error","_classCallCheck2","arguments","_inherits2","_createClass2","_wrapNativeSuper2","Error","NeedsRejoinError","_Error2","_ref","_this","wasSharing","_ref$error","error","_defineProperty2","ReconnectionManager","exports","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","key","value","resetReconnectionTimer","clearTimeout","iceReconnected","LoggerProxy","logger","log","waitForIceReconnect","_this2","_promise","reject","setTimeout","concat","cleanUp","_stopLocalShareStream","_asyncToGenerator2","_regenerator","mark","_callee","reason","wrap","_context","prev","next","unpublishStreams","mediaProperties","shareVideoStream","shareAudioStream","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","stop","stopLocalShareStream","_x","isReconnectInProgress","IN_PROGRESS","canStartReconnection","enabled","info","_reconnect","_callee2","_this3","_ref2","_ref2$networkDisconne","networkDisconnect","_ref2$networkRetry","networkRetry","completionCallback","triggerEvent","_args2","_t","_t2","_t3","_context2","length","id","event","payload","ReconnectionNotStartedError","MEETING_RECONNECTION_STARTING","internal","newMetrics","submitClientEvent","name","options","meetingId","meetings","startReachability","executeReconnection","reconnect","abrupt","message","errors","category","errorCode","fatal","shownToUser","rejoinMeeting","MEETING_RECONNECTION_SUCCESS","recoveredBy","MEETING_RECONNECTION_FAILURE","ReconnectionError","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETING_RECONNECT_FAILURE","correlation_id","correlationId","locus_id","locusUrl","split","pop","stack","finish","_executeReconnection","_callee3","_ref3","_ref3$networkDisconne","media","_t4","_t5","_t6","_context3","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","SHARE_STOPPED_REASON","MEDIA_RECONNECTION","reconnectMercuryWebSocket","device","url","FAILURE","syncMeetings","keepOnlyLocusMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","sent","_x2","_rejoinMeeting","_callee4","_args4","_t7","_t8","_context4","join","rejoin","MEETING_REJOIN","MEETING_MAX_REJOIN_FAILURE","_reconnectMedia","_callee5","_turnServerResult$tur","turnServerResult","iceServers","_context5","roap","doTurnDiscovery","turnServerInfo","urls","push","username","credential","password","webrtcMediaConnection","isMultistream","_values","mediaRequestManagers","forEach","mediaRequestManager","commit","_reconnectMercuryWebSocket","_callee6","_t9","_t0","_context6","mercury","connected","disconnect","connect"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable no-warning-comments */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {\n EVENT_TRIGGERS,\n RECONNECTION,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n _CALL_,\n _LEFT_,\n _ID_,\n RECONNECTION_STATE,\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ReconnectionError from '../common/errors/reconnection';\nimport ReconnectionNotStartedError from '../common/errors/reconnection-not-started';\nimport Metrics from '../metrics';\nimport Meeting from '../meeting';\nimport {MediaRequestManager} from '../multistream/mediaRequestManager';\n\n/**\n * Used to indicate that the reconnect logic needs to be retried.\n *\n * @class NeedsRetryError\n * @extends {Error}\n */\nclass NeedsRetryError extends Error {}\n\n/**\n * Used to indicate that the meeting needs to be rejoined, not just media reconnected\n *\n * @class NeedsRejoinError\n * @extends {Error}\n */\nclass NeedsRejoinError extends Error {\n wasSharing: any;\n\n /**\n * Creates an instance of NeedsRejoinError.\n * @param {Object} params\n * @param {boolean} params.wasSharing\n * @param {Error} params.error\n * @memberof NeedsRejoinError\n */\n constructor({\n wasSharing,\n error = new Error('Meeting needs to be rejoined'),\n }: {\n wasSharing?: boolean;\n error?: Error;\n }) {\n // @ts-ignore\n super(error);\n\n this.wasSharing = wasSharing;\n }\n}\n\n/**\n * @export\n * @class ReconnectionManager\n */\nexport default class ReconnectionManager {\n autoRejoinEnabled: any;\n iceState: any;\n maxRejoinAttempts: any;\n meeting: any;\n rejoinAttempts: any;\n shareStatus: any;\n status: any;\n webex: any;\n /**\n * @param {Meeting} meeting\n */\n constructor(meeting: Meeting) {\n /**\n * Stores ICE reconnection state data.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n this.iceState = {\n disconnected: false,\n resolve: () => {},\n timer: undefined,\n // @ts-ignore\n timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout,\n };\n\n /**\n * @instance\n * @type {RECONNECTION_STATE}\n * @private\n * @memberof ReconnectionManager\n */\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO : change this logic to not save the meeting instance\n // It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date\n // @ts-ignore\n this.webex = meeting.webex;\n /**\n * @instance\n * @type {Meeting}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO: try removing the circular dependency for meeting and reconnection manager\n // try moving this to meetings collection\n this.meeting = meeting;\n\n // @ts-ignore\n this.maxRejoinAttempts = meeting.config.reconnection.maxRejoinAttempts;\n this.rejoinAttempts = 0;\n // @ts-ignore\n this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;\n\n // Make sure reconnection state is in default\n this.reset();\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {void}\n */\n resetReconnectionTimer() {\n this.iceState.resolve();\n this.iceState.resolve = () => {};\n\n if (this.iceState.timer) {\n clearTimeout(this.iceState.timer);\n delete this.iceState.timer;\n }\n }\n\n /**\n * Sets the iceState to connected and clears any disconnect timeouts and\n * related timeout data within the iceState.\n *\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public iceReconnected() {\n if (this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#iceReconnected --> ice has reconnected');\n\n this.resetReconnectionTimer();\n\n this.iceState.disconnected = false;\n }\n }\n\n /**\n * Set the iceState to disconnected and generates a timeout that waits for the\n * iceState to reconnect and then resolves. If the ice state is already\n * processing a reconnect, it immediately resolves. Rejects if the timeout\n * duration is reached.\n *\n * @returns {Promise<undefined>}\n * @public\n * @memberof ReconnectionManager\n */\n public waitForIceReconnect() {\n if (!this.iceState.disconnected) {\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect'\n );\n\n this.iceState.disconnected = true;\n\n return new Promise<void>((resolve, reject) => {\n this.iceState.timer = setTimeout(() => {\n if (this.iceState.disconnected === false) {\n resolve();\n } else {\n this.iceState.disconnected = false;\n reject(\n new Error(`ice reconnection did not occur in ${this.iceState.timeoutDuration}ms`)\n );\n }\n }, this.iceState.timeoutDuration);\n\n this.iceState.resolve = resolve;\n });\n }\n\n // return a resolved promise to prevent multiple catch executions of reconnect\n return Promise.resolve();\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public reset() {\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n this.rejoinAttempts = 0;\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public cleanUp() {\n this.reset();\n }\n\n /**\n * Stop the local share stream.\n *\n * @param {string} reason a {@link SHARE_STOPPED_REASON}\n * @returns {undefined}\n * @private\n * @memberof ReconnectionManager\n */\n private async stopLocalShareStream(reason: string) {\n await this.meeting.unpublishStreams([\n this.meeting.mediaProperties.shareVideoStream,\n this.meeting.mediaProperties.shareAudioStream,\n ]);\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'stopLocalShareStream',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n reason,\n }\n );\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {Boolean} true if reconnection operation is in progress\n */\n isReconnectInProgress() {\n return this.status === RECONNECTION.STATE.IN_PROGRESS;\n }\n\n /**\n * @returns {Boolean}\n * @throws {ReconnectInProgress, ReconnectionDisabled}\n * @private\n * @memberof ReconnectionManager\n */\n private canStartReconnection() {\n if (this.meeting.config.reconnection.enabled) {\n if (this.status === RECONNECTION.STATE.DEFAULT_STATUS) {\n return true;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#canStartReconnection --> Reconnection already in progress.'\n );\n\n return false;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#canStartReconnection --> Reconnection is not enabled.'\n );\n\n return false;\n }\n\n /**\n * Initiates a media reconnect for the active meeting\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @param {boolean} [reconnectOptions.networkRetry=false] indicates if we are retrying the reconnect\n * @param {Function} [completionCallback] callback that gets called when reconnection is started successfully\n * @returns {Promise}\n * @public\n * @memberof ReconnectionManager\n */\n public async reconnect(\n {\n networkDisconnect = false,\n networkRetry = false,\n }: {\n networkDisconnect?: boolean;\n networkRetry?: boolean;\n } = {},\n completionCallback: (() => Promise<void>) | undefined = undefined\n ) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`\n );\n\n const triggerEvent = (event, payload = undefined) =>\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'reconnect',\n },\n event,\n payload\n );\n\n if (!this.canStartReconnection()) {\n throw new ReconnectionNotStartedError();\n }\n\n try {\n this.status = RECONNECTION.STATE.IN_PROGRESS;\n\n triggerEvent(EVENT_TRIGGERS.MEETING_RECONNECTION_STARTING);\n\n if (!networkRetry) {\n // Only log START metrics on the initial reconnect\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect start metric.'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.media.reconnecting',\n options: {\n meetingId: this.meeting.id,\n },\n });\n }\n\n try {\n await this.webex.meetings.startReachability('reconnection');\n } catch (err) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reachability failed, continuing with reconnection attempt, err: ',\n err\n );\n }\n\n try {\n await this.executeReconnection({networkDisconnect});\n } catch (reconnectError) {\n if (reconnectError instanceof NeedsRetryError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.'\n );\n // Reset our reconnect status since we are looping back to the beginning\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n\n // This is a network retry, so we should not log START metrics again\n await this.reconnect({networkDisconnect: true, networkRetry: true}, completionCallback);\n\n return;\n }\n\n // Reconnect has failed\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnect --> Reconnection failed.',\n reconnectError.message\n );\n\n // send call aborted event with category as expected as we are trying to rejoin\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.aborted',\n payload: {\n errors: [\n {\n category: 'expected',\n errorCode: 2008,\n fatal: true,\n name: 'media-engine',\n shownToUser: false,\n },\n ],\n },\n options: {\n meetingId: this.meeting.id,\n },\n });\n\n if (reconnectError instanceof NeedsRejoinError && this.autoRejoinEnabled) {\n await this.rejoinMeeting(reconnectError.wasSharing);\n\n return;\n }\n\n throw reconnectError;\n }\n\n // finalize the reconnection process by calling the completionCallback\n if (completionCallback) {\n await completionCallback();\n }\n\n triggerEvent(EVENT_TRIGGERS.MEETING_RECONNECTION_SUCCESS);\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.media.recovered',\n payload: {\n recoveredBy: 'new',\n },\n options: {\n meetingId: this.meeting.id,\n },\n });\n } catch (error) {\n triggerEvent(EVENT_TRIGGERS.MEETING_RECONNECTION_FAILURE, {\n error: new ReconnectionError('Reconnection failure event', error),\n });\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_RECONNECT_FAILURE, {\n correlation_id: this.meeting.correlationId,\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n throw new ReconnectionError('Reconnection failure event', error);\n } finally {\n this.reset();\n }\n }\n\n /**\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @returns {Promise}\n * @throws {NeedsRetryError}\n * @private\n * @memberof ReconnectionManager\n */\n private async executeReconnection({networkDisconnect = false}: {networkDisconnect?: boolean}) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.'\n );\n\n const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;\n\n if (wasSharing) {\n await this.stopLocalShareStream(SHARE_STOPPED_REASON.MEDIA_RECONNECTION);\n }\n\n if (networkDisconnect) {\n try {\n await this.reconnectMercuryWebSocket();\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Websocket reconnected.',\n this.webex.internal.device.url\n );\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Unable to reconnect to websocket, giving up.'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n throw error;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'\n );\n await this.webex.meetings.syncMeetings({keepOnlyLocusMeetings: false});\n } catch (syncError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.',\n syncError\n );\n throw new NeedsRetryError(syncError);\n }\n\n // TODO: try to improve this logic as the reconnection manager saves the instance of deleted meeting object\n // So that on rejoin it known what parametrs it was using\n if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely.'\n );\n\n throw new Error('Unable to rejoin a meeting already ended or inactive.');\n }\n\n LoggerProxy.logger.info(\n `ReconnectionManager:index#executeReconnection --> Current state of meeting is ${this.meeting.state}`\n );\n\n // If the meeting state was left, no longer reconnect media\n if (this.meeting.state === _LEFT_) {\n if (this.meeting.type === _CALL_) {\n throw new Error('Unable to rejoin a call in LEFT state.');\n }\n\n throw new NeedsRejoinError({wasSharing});\n }\n\n try {\n const media = await this.reconnectMedia();\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#executeReconnection --> webRTC media connection renewed and local sdp offer sent'\n );\n\n return media;\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> failed to renew webRTC media connection or initiate offer'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n\n throw error;\n }\n }\n\n /**\n * Rejoins a meeting after detecting the member was in a LEFT state\n *\n * @async\n * @param {boolean} wasSharing\n * @returns {Promise}\n */\n async rejoinMeeting(wasSharing = false) {\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin'\n );\n\n await this.meeting.join({rejoin: true});\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');\n\n if (wasSharing) {\n await this.stopLocalShareStream(SHARE_STOPPED_REASON.MEETING_REJOIN);\n }\n } catch (joinError) {\n this.rejoinAttempts += 1;\n if (this.rejoinAttempts <= this.maxRejoinAttempts) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting, attempt #${this.rejoinAttempts}, retrying.`,\n joinError\n );\n this.rejoinMeeting();\n } else {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.',\n joinError\n );\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE, {\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: joinError.message,\n stack: joinError.stack,\n });\n this.status = RECONNECTION.STATE.FAILURE;\n throw joinError;\n }\n }\n\n try {\n await this.reconnectMedia();\n } catch (mediaError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to reestablish media after rejoining.',\n mediaError\n );\n throw mediaError;\n }\n }\n\n /**\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n async reconnectMedia() {\n LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> do turn discovery');\n\n // do the TURN server discovery again and ignore reachability results since the TURN server might change\n const turnServerResult = await this.meeting.roap.doTurnDiscovery(this.meeting, true, true);\n\n const iceServers = [];\n\n if (turnServerResult.turnServerInfo?.urls.length > 0) {\n iceServers.push({\n urls: turnServerResult.turnServerInfo.urls,\n username: turnServerResult.turnServerInfo.username || '',\n credential: turnServerResult.turnServerInfo.password || '',\n });\n }\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#reconnectMedia --> renew webRTC media connection and send local sdp offer'\n );\n\n await this.meeting.mediaProperties.webrtcMediaConnection.reconnect(iceServers);\n\n // resend media requests\n if (this.meeting.isMultistream) {\n Object.values(this.meeting.mediaRequestManagers).forEach(\n (mediaRequestManager: MediaRequestManager) => {\n mediaRequestManager.commit();\n }\n );\n }\n }\n\n /**\n * Attempt to Reconnect Mercury Websocket\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n private async reconnectMercuryWebSocket() {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.'\n );\n // First, attempt to disconnect if we think we are already connected.\n if (this.webex.internal.mercury.connected) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Disconnecting existing websocket.'\n );\n try {\n await this.webex.internal.mercury.disconnect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket disconnected successfully.'\n );\n } catch (disconnectError) {\n // If we can't disconnect, the sdk is in such a bad state that reconnecting is not going to happen.\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to disconnect from websocket, giving up.',\n disconnectError\n );\n throw disconnectError;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Connecting websocket.'\n );\n await this.webex.internal.mercury.connect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket connected successfully.'\n );\n } catch (connectError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to connect to websocket, giving up.',\n connectError\n );\n\n throw connectError;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @class AIEnableRequest
3
+ */
4
+ declare const AIEnableRequest: any;
5
+ export default AIEnableRequest;
@@ -0,0 +1,2 @@
1
+ import Meeting from '../meeting';
2
+ export declare const getAIEnablementApprover: (meeting: Meeting) => string;
@@ -64,6 +64,7 @@ declare const _default: {
64
64
  enableAdhocMeetings: boolean;
65
65
  enableTcpReachability: boolean;
66
66
  enableTlsReachability: boolean;
67
+ storeLocusHashTreeEventsForDebugging: boolean;
67
68
  };
68
69
  degradationPreferences: {
69
70
  maxMacroblocksLimit: number;
@@ -76,6 +77,9 @@ declare const _default: {
76
77
  stopIceGatheringAfterFirstRelayCandidate: boolean;
77
78
  enableAudioTwccForMultistream: boolean;
78
79
  enablePerUdpUrlReachability: boolean;
80
+ locus: {
81
+ excludedDataSets: string[];
82
+ };
79
83
  };
80
84
  };
81
85
  export default _default;
@@ -31,6 +31,7 @@ export declare const LOCAL = "local";
31
31
  export declare const LOCI = "loci";
32
32
  export declare const LOCUS_URL = "locusUrl";
33
33
  export declare const END = "end";
34
+ export declare const LLM_PRACTICE_SESSION = "llm-practice-session";
34
35
  export declare const MAX_RANDOM_DELAY_FOR_MEETING_INFO: number;
35
36
  export declare const MEETINGINFO = "meetingInfo";
36
37
  export declare const MEET = "meet";
@@ -272,6 +273,7 @@ export declare const EVENT_TRIGGERS: {
272
273
  MEETING_CONTROLS_REACTIONS_UPDATED: string;
273
274
  MEETING_CONTROLS_VIEW_THE_PARTICIPANTS_LIST_UPDATED: string;
274
275
  MEETING_CONTROLS_RAISE_HAND_UPDATED: string;
276
+ MEETING_CONTROLS_AI_SUMMARY_NOTIFICATION_UPDATED: string;
275
277
  MEETING_CONTROLS_VIDEO_UPDATED: string;
276
278
  MEETING_CONTROLS_STAGE_VIEW_UPDATED: string;
277
279
  MEETING_CONTROLS_WEBCAST_UPDATED: string;
@@ -290,6 +292,7 @@ export declare const EVENT_TRIGGERS: {
290
292
  MEETING_MANUAL_CAPTION_UPDATED: string;
291
293
  MEETING_CAPTION_RECEIVED: string;
292
294
  MEETING_PARTICIPANT_REASON_CHANGED: string;
295
+ MEETING_AI_ENABLE_REQUEST: string;
293
296
  };
294
297
  export declare const EVENT_TYPES: {
295
298
  SELF: string;
@@ -309,7 +312,6 @@ export declare const HEADERS: {
309
312
  };
310
313
  export declare const MEETING_REMOVED_REASON: {
311
314
  SELF_REMOVED: string;
312
- FULLSTATE_REMOVED: string;
313
315
  MEETING_INACTIVE_TERMINATING: string;
314
316
  CLIENT_LEAVE_REQUEST: string;
315
317
  CLIENT_LEAVE_REQUEST_TAB_CLOSED: string;
@@ -570,6 +572,7 @@ export declare const LOCUSINFO: {
570
572
  CONTROLS_MEETING_LAYOUT_UPDATED: string;
571
573
  CONTROLS_RECORDING_UPDATED: string;
572
574
  CONTROLS_MEETING_TRANSCRIBE_UPDATED: string;
575
+ CONTROLS_AI_SUMMARY_NOTIFICATION_UPDATED: string;
573
576
  CONTROLS_MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED: string;
574
577
  CONTROLS_MEETING_MANUAL_CAPTION_UPDATED: string;
575
578
  CONTROLS_MEETING_HESIOD_LLM_ID_UPDATED: string;
@@ -615,6 +618,7 @@ export declare const LOCUSINFO: {
615
618
  SELF_IS_SHARING_BLOCKED_CHANGE: string;
616
619
  SELF_MEETING_BREAKOUTS_CHANGED: string;
617
620
  SELF_MEETING_INTERPRETATION_CHANGED: string;
621
+ SELF_ID_CHANGED: string;
618
622
  SELF_MEETING_BRB_CHANGED: string;
619
623
  MEDIA_INACTIVITY: string;
620
624
  LINKS_SERVICES: string;
@@ -645,6 +649,7 @@ export declare const LOCUSEVENT: {
645
649
  readonly RECORDING_STOPPED: "locus.recording_stopped";
646
650
  readonly SELF_CHANGED: "locus.self_changed";
647
651
  readonly HASH_TREE_DATA_UPDATED: "locus.state_message";
652
+ readonly APPROVAL_REQUEST: "locus.approval_request";
648
653
  readonly SDK_LOCUS_FROM_SYNC_MEETINGS: "jsSdk.locus_from_sync_meetings";
649
654
  readonly SDK_NO_EVENT: "jsSdk.no_event";
650
655
  };
@@ -800,6 +805,8 @@ export declare const DISPLAY_HINTS: {
800
805
  LOWER_SOMEONE_ELSES_HAND: string;
801
806
  LEAVE_TRANSFER_HOST_END_MEETING: string;
802
807
  LEAVE_END_MEETING: string;
808
+ END_MEETING: string;
809
+ REQUIRE_HOST_END_MEETING_BEFORE_LEAVE: string;
803
810
  STREAMING_STATUS_STARTED: string;
804
811
  STREAMING_STATUS_STOPPED: string;
805
812
  CAPTION_START: string;
@@ -875,6 +882,8 @@ export declare const DISPLAY_HINTS: {
875
882
  DISABLE_RDC_MEETING_OPTION: string;
876
883
  ENABLE_ATTENDEE_START_POLLING_QA: string;
877
884
  DISABLE_ATTENDEE_START_POLLING_QA: string;
885
+ ATTENDEE_REQUEST_AI_ASSISTANT_ENABLED: string;
886
+ ATTENDEE_REQUEST_AI_ASSISTANT_DECLINED_ALL: string;
878
887
  };
879
888
  export declare const INTERSTITIAL_DISPLAY_HINTS: string[];
880
889
  export declare const SELF_ROLES: {
@@ -1152,3 +1161,16 @@ export declare const STAGE_MANAGER_TYPE: {
1152
1161
  BACKGROUND: number;
1153
1162
  NAME_LABEL: number;
1154
1163
  };
1164
+ export declare const DEFAULT_LARGE_SCALE_WEBINAR_ATTENDEE_SEARCH_LIMIT = 50;
1165
+ export declare const AI_ENABLE_REQUEST: {
1166
+ EVENTS: {
1167
+ APPROVAL_REQUEST_ARRIVED: string;
1168
+ };
1169
+ ACTION_TYPE: {
1170
+ REQUESTED: string;
1171
+ ACCEPTED: string;
1172
+ DECLINED: string;
1173
+ DECLINED_ALL: string;
1174
+ };
1175
+ RESOURCE_TYPE: string;
1176
+ };
@@ -5,4 +5,5 @@ export declare const DataSetNames: {
5
5
  ATD_ACTIVE: string;
6
6
  ATD_UNMUTED: string;
7
7
  SELF: string;
8
+ UNJOINED: string;
8
9
  };
@@ -110,6 +110,13 @@ declare class HashTree {
110
110
  * or an empty array if the index is invalid or leaf is empty.
111
111
  */
112
112
  getLeafData(leafIndex: number): LeafDataItem[];
113
+ /**
114
+ * Retrieves the version of a specific item by its id and type.
115
+ * @param {number} id The ID of the item.
116
+ * @param {ObjectType} type The type of the item.
117
+ * @returns {number | undefined} The version of the item if found, undefined otherwise.
118
+ */
119
+ getItemVersion(id: number, type: ObjectType): number | undefined;
113
120
  /**
114
121
  * Resizes the HashTree to have a new number of leaf nodes, redistributing all existing items.
115
122
  * @param {number} newNumLeaves The new number of leaf nodes (must be 0 or a power of 2).
@@ -1,6 +1,6 @@
1
1
  import HashTree from './hashTree';
2
2
  import { Enum } from '../constants';
3
- import { HashTreeObject } from './types';
3
+ import { HtMeta, HashTreeObject } from './types';
4
4
  import { LocusDTO } from '../locus-info/types';
5
5
  export interface DataSet {
6
6
  url: string;
@@ -23,10 +23,21 @@ export interface HashTreeMessage {
23
23
  locusStateElements?: Array<HashTreeObject>;
24
24
  locusSessionId?: string;
25
25
  locusUrl: string;
26
+ heartbeatIntervalMs?: number;
27
+ }
28
+ export interface VisibleDataSetInfo {
29
+ name: string;
30
+ url: string;
31
+ dataChannelUrl?: string;
32
+ }
33
+ export interface Metadata {
34
+ htMeta: HtMeta;
35
+ visibleDataSets: VisibleDataSetInfo[];
26
36
  }
27
37
  interface InternalDataSet extends DataSet {
28
38
  hashTree?: HashTree;
29
39
  timer?: ReturnType<typeof setTimeout>;
40
+ heartbeatWatchdogTimer?: ReturnType<typeof setTimeout>;
30
41
  }
31
42
  type WebexRequestMethod = (options: Record<string, any>) => Promise<any>;
32
43
  export declare const LocusInfoUpdateType: {
@@ -37,6 +48,12 @@ export type LocusInfoUpdateType = Enum<typeof LocusInfoUpdateType>;
37
48
  export type LocusInfoUpdateCallback = (updateType: LocusInfoUpdateType, data?: {
38
49
  updatedObjects: HashTreeObject[];
39
50
  }) => void;
51
+ /**
52
+ * This error is thrown if we receive information that the meeting has ended while we're processing some hash messages.
53
+ * It's handled internally by HashTreeParser and results in MEETING_ENDED being sent up.
54
+ */
55
+ export declare class MeetingEndedError extends Error {
56
+ }
40
57
  /**
41
58
  * Parses hash tree eventing locus data
42
59
  */
@@ -45,8 +62,11 @@ declare class HashTreeParser {
45
62
  visibleDataSetsUrl: string;
46
63
  webexRequest: WebexRequestMethod;
47
64
  locusInfoUpdateCallback: LocusInfoUpdateCallback;
48
- visibleDataSets: string[];
65
+ visibleDataSets: VisibleDataSetInfo[];
49
66
  debugId: string;
67
+ heartbeatIntervalMs?: number;
68
+ private excludedDataSets;
69
+ state: 'active' | 'stopped';
50
70
  /**
51
71
  * Constructor for HashTreeParser
52
72
  * @param {Object} options
@@ -57,16 +77,46 @@ declare class HashTreeParser {
57
77
  dataSets: Array<DataSet>;
58
78
  locus: any;
59
79
  };
80
+ metadata: Metadata | null;
60
81
  webexRequest: WebexRequestMethod;
61
82
  locusInfoUpdateCallback: LocusInfoUpdateCallback;
62
83
  debugId: string;
84
+ excludedDataSets?: string[];
63
85
  });
86
+ /**
87
+ * Sets the visible data sets list for the HashTreeParser. This method should be called only at the start, to initialize
88
+ * the visible data sets, before any message processsing, so for example from the constructor or when resuming the parser.
89
+ *
90
+ * @param {Array<VisibleDataSetInfo>} visibleDataSets - The visible data sets to set
91
+ * @param {Array<DataSet>} dataSets - The "dataSets" list from Locus (yes, Locus sends visibleDataSets and dataSets as separate lists and they can differ)
92
+ * @returns {void}
93
+ */
94
+ private setVisibleDataSets;
95
+ /**
96
+ * Checks if the given data set name is in the list of visible data sets
97
+ * @param {string} dataSetName data set name to check
98
+ * @returns {Boolean} True if the data set is visible, false otherwise
99
+ */
100
+ private isVisibleDataSet;
101
+ /**
102
+ * Checks if the given data set name is in the excluded list
103
+ * @param {string} dataSetName data set name to check
104
+ * @returns {boolean} True if the data set is excluded, false otherwise
105
+ */
106
+ private isExcludedDataSet;
107
+ /**
108
+ * Adds a data set to the visible data sets list, unless it is in the excluded list.
109
+ * @param {VisibleDataSetInfo} dataSetInfo data set info to add
110
+ * @returns {boolean} True if the data set was added, false if it was excluded
111
+ */
112
+ private addToVisibleDataSetsList;
64
113
  /**
65
114
  * Initializes a new visible data set by creating a hash tree for it, adding it to all the internal structures,
66
115
  * and sending an initial sync request to Locus with empty leaf data - that will trigger Locus to gives us all the data
67
116
  * from that dataset (in the response or via messages).
68
117
  *
69
- * @param {DataSet} dataSet The new data set to be added
118
+ * @param {VisibleDataSetInfo} visibleDataSetInfo Information about the new visible data set
119
+ * @param {DataSet} dataSetInfo The new data set to be added
70
120
  * @returns {Promise}
71
121
  */
72
122
  private initializeNewVisibleDataSet;
@@ -79,12 +129,11 @@ declare class HashTreeParser {
79
129
  */
80
130
  private sendInitializationSyncRequestToLocus;
81
131
  /**
82
- * Queries Locus for information about all the data sets
132
+ * Queries Locus for all up-to-date information about all visible data sets
83
133
  *
84
- * @param {string} url - url from which we can get info about all data sets
85
134
  * @returns {Promise}
86
135
  */
87
- private getAllDataSetsMetadata;
136
+ private getAllVisibleDataSetsFromLocus;
88
137
  /**
89
138
  * Initializes the hash tree parser from a message received from Locus.
90
139
  *
@@ -105,7 +154,7 @@ declare class HashTreeParser {
105
154
  /**
106
155
  * Initializes data sets by doing an initialization sync on each visible data set that doesn't have a hash tree yet.
107
156
  *
108
- * @param {DataSet[]} dataSets Array of DataSet objects to initialize
157
+ * @param {DataSet[]} visibleDataSets Array of visible DataSet objects to initialize
109
158
  * @param {string} debugText Text to include in logs for debugging purposes
110
159
  * @returns {Promise}
111
160
  */
@@ -121,6 +170,15 @@ declare class HashTreeParser {
121
170
  * @returns {any} - An object mapping dataset names to arrays of leaf data
122
171
  */
123
172
  private analyzeLocusHtMeta;
173
+ /**
174
+ * Analyzes the Metadata object that is sent outside of Locus object, and appends its data to passed in leafInfo
175
+ * structure.
176
+ *
177
+ * @param {Record<string, LeafInfo[]>} leafInfo the structure to which the Metadata info will be appended
178
+ * @param {Metadata} metadata Metadata object
179
+ * @returns {void}
180
+ */
181
+ private analyzeMetadata;
124
182
  /**
125
183
  * Checks if the provided hash tree message indicates the end of the meeting and that there won't be any more updates.
126
184
  *
@@ -135,6 +193,22 @@ declare class HashTreeParser {
135
193
  * @returns {void}
136
194
  */
137
195
  private handleRootHashHeartBeatMessage;
196
+ /**
197
+ * Asynchronously initializes new visible data sets
198
+ *
199
+ * @param {VisibleDataSetInfo[]} dataSetsRequiringInitialization list of datasets to initialize
200
+ * @returns {void}
201
+ */
202
+ private queueInitForNewVisibleDataSets;
203
+ /**
204
+ * Handles updates to Metadata object that we receive from Locus via other means than messages. Right now
205
+ * that means only in the API response alongside locus object.
206
+ *
207
+ * @param {Metadata} metadata received in Locus update other than a message (for example in an API response)
208
+ * @param {HashTreeObject[]} updatedObjects a list of updated hash tree objects to which any updates resulting from new Metadata will be added
209
+ * @returns {void}
210
+ */
211
+ handleMetadataUpdate(metadata: Metadata, updatedObjects: HashTreeObject[]): void;
138
212
  /**
139
213
  * This method should be called when we receive a partial locus DTO that contains dataSets and htMeta information
140
214
  * It updates the hash trees with the new leaf data based on the received Locus
@@ -145,6 +219,7 @@ declare class HashTreeParser {
145
219
  handleLocusUpdate(update: {
146
220
  dataSets?: Array<DataSet>;
147
221
  locus: any;
222
+ metadata?: Metadata;
148
223
  }): void;
149
224
  /**
150
225
  * Updates the internal data set information based on the received data set from Locus.
@@ -175,18 +250,17 @@ declare class HashTreeParser {
175
250
  * visible data sets and they require async initialization, the names of these data sets
176
251
  * are returned in an array.
177
252
  *
178
- * @param {string[]} removedDataSets - The list of removed data sets.
179
- * @param {string[]} addedDataSets - The list of added data sets.
253
+ * @param {VisibleDataSetInfo[]} removedDataSets - The list of removed data sets.
254
+ * @param {VisibleDataSetInfo[]} addedDataSets - The list of added data sets.
180
255
  * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects to which changes will be added.
181
- * @returns {string[]} names of data sets that couldn't be initialized synchronously
256
+ * @returns {VisibleDataSetInfo[]} list of data sets that couldn't be initialized synchronously
182
257
  */
183
258
  private processVisibleDataSetChanges;
184
259
  /**
185
260
  * Adds entries to the passed in updateObjects array
186
261
  * for the changes that result from adding and removing visible data sets.
187
262
  *
188
- * @param {HashTreeMessage} message - The hash tree message that triggered the visible data set changes.
189
- * @param {string[]} addedDataSets - The list of added data sets.
263
+ * @param {VisibleDataSetInfo[]} addedDataSets - The list of added data sets.
190
264
  * @returns {Promise<void>}
191
265
  */
192
266
  private initializeNewVisibleDataSets;
@@ -195,7 +269,7 @@ declare class HashTreeParser {
195
269
  *
196
270
  * @param {HashTreeMessage} message - The hash tree message containing data sets and objects to be processed
197
271
  * @param {string} [debugText] - Optional debug text to include in logs
198
- * @returns {Promise}
272
+ * @returns {HashTreeObject[]} list of hash tree objects that were updated as a result of processing the message
199
273
  */
200
274
  private parseMessage;
201
275
  /**
@@ -205,7 +279,7 @@ declare class HashTreeParser {
205
279
  * @param {string} [debugText] - Optional debug text to include in logs
206
280
  * @returns {void}
207
281
  */
208
- handleMessage(message: HashTreeMessage, debugText?: string): Promise<void>;
282
+ handleMessage(message: HashTreeMessage, debugText?: string): void;
209
283
  /**
210
284
  * Calls the updateInfo callback if there are any updates to report
211
285
  *
@@ -220,6 +294,15 @@ declare class HashTreeParser {
220
294
  * @returns {number} - A weighted backoff time based on the provided configuration, using algorithm supplied by Locus team
221
295
  */
222
296
  private getWeightedBackoffTime;
297
+ /**
298
+ * Performs a sync for the given data set.
299
+ *
300
+ * @param {InternalDataSet} dataSet - The data set to sync
301
+ * @param {string} rootHash - Our current root hash for this data set
302
+ * @param {string} reason - The reason for the sync (used for logging)
303
+ * @returns {Promise<void>}
304
+ */
305
+ private performSync;
223
306
  /**
224
307
  * Runs the sync algorithm for the given data set.
225
308
  *
@@ -227,14 +310,39 @@ declare class HashTreeParser {
227
310
  * @returns {void}
228
311
  */
229
312
  private runSyncAlgorithm;
313
+ /**
314
+ * Resets the heartbeat watchdog timers for the specified data sets. Each data set has its own
315
+ * watchdog timer that monitors whether heartbeats are being received within the expected interval.
316
+ * If a heartbeat is not received for a specific data set within heartbeatIntervalMs plus
317
+ * a backoff-calculated time, the sync algorithm is initiated for that data set
318
+ *
319
+ * @param {Array<DataSet>} receivedDataSets - The data sets from the received message for which watchdog timers should be reset
320
+ * @returns {void}
321
+ */
322
+ private resetHeartbeatWatchdogs;
230
323
  /**
231
324
  * Stops all timers for the data sets to prevent any further sync attempts.
232
325
  * @returns {void}
233
326
  */
234
327
  private stopAllTimers;
328
+ /**
329
+ * Stops the HashTreeParser, preventing it from processing any further messages and clearing all timers.
330
+ * It also clears all the hash trees, so if the parser is resumed later, it will need to do a sync
331
+ * to be up-to-date.
332
+ * @returns {void}
333
+ */
334
+ stop(): void;
335
+ /**
336
+ * Resumes the HashTreeParser that was previously stopped.
337
+ * @param {HashTreeMessage} message - The message to resume with, it must contain metadata with visible data sets info
338
+ * @returns {void}
339
+ */
340
+ resume(message: HashTreeMessage): void;
341
+ private checkForSentinelHttpResponse;
235
342
  /**
236
343
  * Gets the current hashes from the locus for a specific data set.
237
344
  * @param {string} dataSetName
345
+ * @param {string} currentRootHash
238
346
  * @returns {string[]}
239
347
  */
240
348
  private getHashesFromLocus;
@@ -8,6 +8,8 @@ export declare const ObjectType: {
8
8
  readonly fullState: "fullstate";
9
9
  readonly links: "links";
10
10
  readonly control: "controlentry";
11
+ readonly metadata: "metadata";
12
+ readonly embeddedApp: "embeddedapp";
11
13
  };
12
14
  export type ObjectType = Enum<typeof ObjectType>;
13
15
  export declare const ObjectTypeToLocusKeyMap: {
@@ -18,6 +20,7 @@ export declare const ObjectTypeToLocusKeyMap: {
18
20
  participant: string;
19
21
  mediashare: string;
20
22
  controlentry: string;
23
+ embeddedapp: string;
21
24
  };
22
25
  export interface HtMeta {
23
26
  elementId: {
@@ -5,6 +5,12 @@ import { HashTreeObject } from './types';
5
5
  * @returns {boolean} True if the object is of type "self", false otherwise
6
6
  */
7
7
  export declare function isSelf(object: HashTreeObject): boolean;
8
+ /**
9
+ * Checks if the given hash tree object is of type "Metadata"
10
+ * @param {HashTreeObject} object object to check
11
+ * @returns {boolean} True if the object is of type "Metadata", false otherwise
12
+ */
13
+ export declare function isMetadata(object: HashTreeObject): boolean;
8
14
  /**
9
15
  * Analyzes given part of Locus DTO recursively and delete any nested objects that have their own htMeta
10
16
  *