@webex/plugin-meetings 3.0.0-stream-classes.4 → 3.0.0-test.1

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 (239) hide show
  1. package/README.md +12 -0
  2. package/dist/breakouts/breakout.js +1 -1
  3. package/dist/breakouts/index.js +1 -1
  4. package/dist/common/errors/no-meeting-info.js +51 -0
  5. package/dist/common/errors/no-meeting-info.js.map +1 -0
  6. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  7. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  8. package/dist/common/errors/webex-errors.js +23 -3
  9. package/dist/common/errors/webex-errors.js.map +1 -1
  10. package/dist/common/logs/request.js +5 -1
  11. package/dist/common/logs/request.js.map +1 -1
  12. package/dist/config.js +1 -1
  13. package/dist/config.js.map +1 -1
  14. package/dist/constants.js +69 -9
  15. package/dist/constants.js.map +1 -1
  16. package/dist/index.js +11 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/interceptors/index.js +15 -0
  19. package/dist/interceptors/index.js.map +1 -0
  20. package/dist/interceptors/locusRetry.js +93 -0
  21. package/dist/interceptors/locusRetry.js.map +1 -0
  22. package/dist/interpretation/index.js +16 -2
  23. package/dist/interpretation/index.js.map +1 -1
  24. package/dist/interpretation/siLanguage.js +1 -1
  25. package/dist/locus-info/index.js +40 -11
  26. package/dist/locus-info/index.js.map +1 -1
  27. package/dist/locus-info/mediaSharesUtils.js +15 -1
  28. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  29. package/dist/locus-info/parser.js +42 -21
  30. package/dist/locus-info/parser.js.map +1 -1
  31. package/dist/media/index.js +10 -6
  32. package/dist/media/index.js.map +1 -1
  33. package/dist/media/properties.js +13 -3
  34. package/dist/media/properties.js.map +1 -1
  35. package/dist/mediaQualityMetrics/config.js +135 -330
  36. package/dist/mediaQualityMetrics/config.js.map +1 -1
  37. package/dist/meeting/in-meeting-actions.js +4 -0
  38. package/dist/meeting/in-meeting-actions.js.map +1 -1
  39. package/dist/meeting/index.js +2187 -1074
  40. package/dist/meeting/index.js.map +1 -1
  41. package/dist/meeting/muteState.js +37 -25
  42. package/dist/meeting/muteState.js.map +1 -1
  43. package/dist/meeting/request.js +34 -19
  44. package/dist/meeting/request.js.map +1 -1
  45. package/dist/meeting/util.js +71 -0
  46. package/dist/meeting/util.js.map +1 -1
  47. package/dist/meeting-info/index.js +48 -23
  48. package/dist/meeting-info/index.js.map +1 -1
  49. package/dist/meeting-info/meeting-info-v2.js +25 -4
  50. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  51. package/dist/meeting-info/utilv2.js +1 -1
  52. package/dist/meeting-info/utilv2.js.map +1 -1
  53. package/dist/meetings/collection.js +17 -0
  54. package/dist/meetings/collection.js.map +1 -1
  55. package/dist/meetings/index.js +142 -57
  56. package/dist/meetings/index.js.map +1 -1
  57. package/dist/meetings/util.js +2 -6
  58. package/dist/meetings/util.js.map +1 -1
  59. package/dist/member/index.js +9 -0
  60. package/dist/member/index.js.map +1 -1
  61. package/dist/member/util.js +11 -0
  62. package/dist/member/util.js.map +1 -1
  63. package/dist/members/index.js +17 -1
  64. package/dist/members/index.js.map +1 -1
  65. package/dist/members/types.js.map +1 -1
  66. package/dist/members/util.js +15 -4
  67. package/dist/members/util.js.map +1 -1
  68. package/dist/metrics/constants.js +15 -1
  69. package/dist/metrics/constants.js.map +1 -1
  70. package/dist/multistream/mediaRequestManager.js +1 -1
  71. package/dist/multistream/mediaRequestManager.js.map +1 -1
  72. package/dist/multistream/remoteMediaGroup.js +16 -2
  73. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  74. package/dist/multistream/remoteMediaManager.js +222 -73
  75. package/dist/multistream/remoteMediaManager.js.map +1 -1
  76. package/dist/multistream/sendSlotManager.js +22 -0
  77. package/dist/multistream/sendSlotManager.js.map +1 -1
  78. package/dist/reachability/clusterReachability.js +356 -0
  79. package/dist/reachability/clusterReachability.js.map +1 -0
  80. package/dist/reachability/index.js +262 -432
  81. package/dist/reachability/index.js.map +1 -1
  82. package/dist/reachability/request.js +1 -1
  83. package/dist/reachability/request.js.map +1 -1
  84. package/dist/reachability/util.js +29 -0
  85. package/dist/reachability/util.js.map +1 -0
  86. package/dist/reconnection-manager/index.js +113 -96
  87. package/dist/reconnection-manager/index.js.map +1 -1
  88. package/dist/roap/index.js +57 -25
  89. package/dist/roap/index.js.map +1 -1
  90. package/dist/roap/request.js +5 -13
  91. package/dist/roap/request.js.map +1 -1
  92. package/dist/roap/turnDiscovery.js +173 -81
  93. package/dist/roap/turnDiscovery.js.map +1 -1
  94. package/dist/rtcMetrics/index.js +68 -6
  95. package/dist/rtcMetrics/index.js.map +1 -1
  96. package/dist/statsAnalyzer/index.js +338 -289
  97. package/dist/statsAnalyzer/index.js.map +1 -1
  98. package/dist/statsAnalyzer/mqaUtil.js +296 -156
  99. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  100. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  101. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  102. package/dist/types/common/errors/webex-errors.d.ts +13 -1
  103. package/dist/types/common/logs/request.d.ts +2 -0
  104. package/dist/types/config.d.ts +1 -1
  105. package/dist/types/constants.d.ts +66 -13
  106. package/dist/types/index.d.ts +1 -1
  107. package/dist/types/interceptors/index.d.ts +2 -0
  108. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  109. package/dist/types/locus-info/index.d.ts +1 -1
  110. package/dist/types/locus-info/parser.d.ts +3 -2
  111. package/dist/types/mediaQualityMetrics/config.d.ts +99 -223
  112. package/dist/types/meeting/in-meeting-actions.d.ts +4 -0
  113. package/dist/types/meeting/index.d.ts +285 -34
  114. package/dist/types/meeting/locusMediaRequest.d.ts +1 -2
  115. package/dist/types/meeting/muteState.d.ts +2 -8
  116. package/dist/types/meeting/request.d.ts +4 -1
  117. package/dist/types/meeting/util.d.ts +25 -1
  118. package/dist/types/meeting-info/index.d.ts +7 -0
  119. package/dist/types/meeting-info/meeting-info-v2.d.ts +1 -0
  120. package/dist/types/meetings/collection.d.ts +9 -0
  121. package/dist/types/meetings/index.d.ts +42 -14
  122. package/dist/types/member/index.d.ts +1 -0
  123. package/dist/types/members/types.d.ts +1 -0
  124. package/dist/types/members/util.d.ts +5 -0
  125. package/dist/types/metrics/constants.d.ts +15 -0
  126. package/dist/types/multistream/mediaRequestManager.d.ts +2 -0
  127. package/dist/types/multistream/remoteMediaGroup.d.ts +2 -0
  128. package/dist/types/multistream/remoteMediaManager.d.ts +25 -1
  129. package/dist/types/multistream/sendSlotManager.d.ts +9 -0
  130. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  131. package/dist/types/reachability/index.d.ts +59 -112
  132. package/dist/types/reachability/request.d.ts +1 -1
  133. package/dist/types/reachability/util.d.ts +8 -0
  134. package/dist/types/reconnection-manager/index.d.ts +10 -0
  135. package/dist/types/roap/index.d.ts +2 -1
  136. package/dist/types/roap/request.d.ts +2 -1
  137. package/dist/types/roap/turnDiscovery.d.ts +21 -4
  138. package/dist/types/rtcMetrics/index.d.ts +15 -1
  139. package/dist/types/statsAnalyzer/index.d.ts +28 -11
  140. package/dist/types/statsAnalyzer/mqaUtil.d.ts +28 -4
  141. package/dist/types/webinar/collection.d.ts +16 -0
  142. package/dist/types/webinar/index.d.ts +5 -0
  143. package/dist/webinar/collection.js +44 -0
  144. package/dist/webinar/collection.js.map +1 -0
  145. package/dist/webinar/index.js +69 -0
  146. package/dist/webinar/index.js.map +1 -0
  147. package/package.json +3 -2
  148. package/src/common/errors/no-meeting-info.ts +24 -0
  149. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  150. package/src/common/errors/webex-errors.ts +19 -2
  151. package/src/common/logs/request.ts +5 -1
  152. package/src/config.ts +1 -1
  153. package/src/constants.ts +71 -6
  154. package/src/index.ts +5 -0
  155. package/src/interceptors/index.ts +3 -0
  156. package/src/interceptors/locusRetry.ts +67 -0
  157. package/src/interpretation/index.ts +18 -1
  158. package/src/locus-info/index.ts +52 -16
  159. package/src/locus-info/mediaSharesUtils.ts +16 -0
  160. package/src/locus-info/parser.ts +47 -21
  161. package/src/media/index.ts +8 -6
  162. package/src/media/properties.ts +17 -2
  163. package/src/mediaQualityMetrics/config.ts +103 -238
  164. package/src/meeting/in-meeting-actions.ts +8 -0
  165. package/src/meeting/index.ts +1510 -529
  166. package/src/meeting/muteState.ts +34 -20
  167. package/src/meeting/request.ts +19 -1
  168. package/src/meeting/util.ts +97 -0
  169. package/src/meeting-info/index.ts +47 -20
  170. package/src/meeting-info/meeting-info-v2.ts +27 -5
  171. package/src/meeting-info/utilv2.ts +1 -1
  172. package/src/meetings/collection.ts +13 -0
  173. package/src/meetings/index.ts +112 -31
  174. package/src/meetings/util.ts +2 -8
  175. package/src/member/index.ts +9 -0
  176. package/src/member/util.ts +14 -0
  177. package/src/members/index.ts +29 -2
  178. package/src/members/types.ts +1 -0
  179. package/src/members/util.ts +15 -1
  180. package/src/metrics/constants.ts +14 -0
  181. package/src/multistream/mediaRequestManager.ts +4 -1
  182. package/src/multistream/remoteMediaGroup.ts +19 -0
  183. package/src/multistream/remoteMediaManager.ts +141 -18
  184. package/src/multistream/sendSlotManager.ts +29 -0
  185. package/src/reachability/clusterReachability.ts +320 -0
  186. package/src/reachability/index.ts +221 -382
  187. package/src/reachability/request.ts +1 -1
  188. package/src/reachability/util.ts +24 -0
  189. package/src/reconnection-manager/index.ts +87 -83
  190. package/src/roap/index.ts +60 -24
  191. package/src/roap/request.ts +3 -16
  192. package/src/roap/turnDiscovery.ts +112 -39
  193. package/src/rtcMetrics/index.ts +71 -5
  194. package/src/statsAnalyzer/index.ts +430 -427
  195. package/src/statsAnalyzer/mqaUtil.ts +317 -168
  196. package/src/webinar/collection.ts +31 -0
  197. package/src/webinar/index.ts +62 -0
  198. package/test/integration/spec/converged-space-meetings.js +7 -7
  199. package/test/integration/spec/journey.js +86 -104
  200. package/test/integration/spec/space-meeting.js +9 -9
  201. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  202. package/test/unit/spec/interpretation/index.ts +36 -3
  203. package/test/unit/spec/locus-info/index.js +205 -12
  204. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  205. package/test/unit/spec/locus-info/mediaSharesUtils.ts +10 -0
  206. package/test/unit/spec/locus-info/parser.js +54 -13
  207. package/test/unit/spec/media/index.ts +20 -4
  208. package/test/unit/spec/media/properties.ts +2 -2
  209. package/test/unit/spec/meeting/in-meeting-actions.ts +4 -0
  210. package/test/unit/spec/meeting/index.js +4027 -1075
  211. package/test/unit/spec/meeting/muteState.js +219 -67
  212. package/test/unit/spec/meeting/request.js +63 -12
  213. package/test/unit/spec/meeting/utils.js +93 -0
  214. package/test/unit/spec/meeting-info/index.js +180 -61
  215. package/test/unit/spec/meeting-info/meetinginfov2.js +196 -53
  216. package/test/unit/spec/meetings/collection.js +12 -0
  217. package/test/unit/spec/meetings/index.js +619 -206
  218. package/test/unit/spec/meetings/utils.js +35 -12
  219. package/test/unit/spec/member/index.js +8 -7
  220. package/test/unit/spec/member/util.js +32 -0
  221. package/test/unit/spec/members/index.js +130 -17
  222. package/test/unit/spec/members/utils.js +26 -0
  223. package/test/unit/spec/multistream/mediaRequestManager.ts +20 -2
  224. package/test/unit/spec/multistream/remoteMediaGroup.ts +80 -1
  225. package/test/unit/spec/multistream/remoteMediaManager.ts +210 -3
  226. package/test/unit/spec/multistream/sendSlotManager.ts +50 -18
  227. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  228. package/test/unit/spec/reachability/index.ts +505 -135
  229. package/test/unit/spec/reachability/util.ts +40 -0
  230. package/test/unit/spec/reconnection-manager/index.js +74 -17
  231. package/test/unit/spec/roap/index.ts +181 -61
  232. package/test/unit/spec/roap/request.ts +27 -3
  233. package/test/unit/spec/roap/turnDiscovery.ts +362 -101
  234. package/test/unit/spec/rtcMetrics/index.ts +57 -3
  235. package/test/unit/spec/stats-analyzer/index.js +1225 -12
  236. package/test/unit/spec/webinar/collection.ts +13 -0
  237. package/test/unit/spec/webinar/index.ts +60 -0
  238. package/test/utils/integrationTestUtils.js +4 -4
  239. package/test/utils/webex-test-users.js +12 -4
@@ -1 +1 @@
1
- {"version":3,"names":["DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","Reachability","webex","REACHABILITY","namespace","reachabilityRequest","ReachabilityRequest","clusterLatencyResults","setup","boundedStorage","del","localStorageResult","localStorageJoinCookie","getClusters","MeetingUtil","getIpVersion","clusters","joinCookie","performReachabilityCheck","results","put","LoggerProxy","logger","log","error","reachable","get","catch","reachabilityData","reachabilityResults","JSON","parse","some","result","udp","tcp","e","cluster","iceServers","map","url","username","credential","urls","iceCandidatePoolSize","iceTransportPolicy","key","config","peerConnection","window","RTCPeerConnection","peerConnectionError","startTime","begin","clusterList","buildPeerConnectionConfig","createPeerConnection","createOffer","offerToReceiveAudio","description","setLocalDescription","iceGatheringState","isVideoMesh","iceGatheringStateError","all","then","parseIceResultsToReachabilityResults","reachabilityLatencyResults","logUnreachableClusters","unreachableList","forEach","unreachable","push","onicegatheringstatechange","COMPLETE","ICE_GATHERING_STATE","iceConnectionState","elapsed","getElapsedTime","setLatencyAndClose","onicecandidate","SERVER_REFLEXIVE","candidate","String","type","toLowerCase","addPublicIP","address","timeout","ELAPSED","resolve","peerConnectionProxy","Proxy","target","property","targetMember","bind","set","value","clusterId","publicIPs","Reflect","handleIceGatheringStateChange","handleOnIceCandidate","setTimeout","CLOSED","CONNECTION_STATE","connectionState","list","getUnreachablClusters","iceResults","reachabilityMap","latencyResult","latencyInMilliseconds","toString","clientMediaIPs","untested","xtls","length","getLocalSDPForClusters","localSDPData","publicIP","modifiedPeerConnection","REACHABLE","UNREACHABLE","resultKey","intialState","close"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\n/* globals window */\nimport _ from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {ICE_GATHERING_STATE, CONNECTION_STATE, REACHABILITY} from '../constants';\n\nimport ReachabilityRequest from './request';\n\nconst DEFAULT_TIMEOUT = 3000;\nconst VIDEO_MESH_TIMEOUT = 1000;\n\nexport type ICECandidateResult = {clusterId: string; elapsed?: string | null; publicIPs?: string[]};\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: any;\n clusterLatencyResults: any;\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n /**\n * internal object of clusters latency results\n * @instance\n * @type {object}\n * @private\n * @memberof Reachability\n */\n this.clusterLatencyResults = {};\n }\n\n /**\n * fetches reachability data\n * @returns {Object} reachability data\n * @public\n * @async\n * @memberof Reachability\n */\n public async gatherReachability() {\n this.setup();\n\n // Remove stored reachability results to ensure no stale data\n // @ts-ignore\n await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageResult);\n // @ts-ignore\n await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageJoinCookie);\n\n // Fetch clusters and measure latency\n try {\n const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(\n MeetingUtil.getIpVersion(this.webex)\n );\n\n // Perform Reachability Check\n const results = await this.performReachabilityCheck(clusters);\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n LoggerProxy.logger.log(\n 'Reachability:index#gatherReachability --> Reachability checks completed'\n );\n\n return results;\n } catch (getClusterError) {\n LoggerProxy.logger.error(\n `Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`\n );\n\n return {};\n }\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n async isAnyClusterReachable() {\n let reachable = false;\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result: any) => result.udp?.reachable === 'true' || result.tcp?.reachable === 'true'\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return reachable;\n }\n\n /**\n * Generate peerConnection config settings\n * @param {object} cluster\n * @returns {object} peerConnectionConfig\n * @private\n * @memberof Reachability\n */\n private buildPeerConnectionConfig(cluster: any) {\n const iceServers = _.uniq(cluster.udp).map((url) => ({\n username: '',\n credential: '',\n urls: [url],\n }));\n\n return {\n iceServers: [...iceServers],\n iceCandidatePoolSize: '0',\n iceTransportPolicy: 'all',\n };\n }\n\n /**\n * Creates an RTCPeerConnection\n * @param {object} cluster\n * @returns {RTCPeerConnection} peerConnection\n * @private\n * @memberof Reachability\n */\n private createPeerConnection(cluster: any) {\n const {key, config} = cluster;\n\n try {\n const peerConnection = new window.RTCPeerConnection(config);\n\n // @ts-ignore\n peerConnection.key = key;\n\n return peerConnection;\n } catch (peerConnectionError) {\n LoggerProxy.logger.log(\n `Reachability:index#createPeerConnection --> Error creating peerConnection: ${peerConnectionError}`\n );\n\n return null;\n }\n }\n\n /**\n * Gets total elapsed time\n * @param {RTCPeerConnection} peerConnection\n * @returns {Number} Milliseconds\n * @private\n * @memberof Reachability\n */\n private getElapsedTime(peerConnection: any) {\n const startTime = peerConnection.begin;\n\n delete peerConnection.begin;\n\n return Date.now() - startTime;\n }\n\n /**\n * creates offer and generates localSDP\n * @param {object} clusterList cluster List\n * @returns {Promise} Reachability latency results\n * @private\n * @memberof Reachability\n */\n private getLocalSDPForClusters(clusterList: object) {\n let clusters: any[] = [...Object.keys(clusterList)];\n\n clusters = clusters.map(async (key) => {\n const cluster = clusterList[key];\n const config = this.buildPeerConnectionConfig(cluster);\n const peerConnection = this.createPeerConnection({key, config});\n const description = await peerConnection.createOffer({offerToReceiveAudio: true});\n\n // @ts-ignore\n peerConnection.begin = Date.now();\n peerConnection.setLocalDescription(description);\n\n return this.iceGatheringState(\n peerConnection,\n cluster.isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT\n ).catch((iceGatheringStateError) => {\n LoggerProxy.logger.log(\n `Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`\n );\n });\n });\n\n return Promise.all(clusters)\n .then(this.parseIceResultsToReachabilityResults)\n .then((reachabilityLatencyResults) => {\n this.logUnreachableClusters();\n\n // return results\n return reachabilityLatencyResults;\n });\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachablClusters() {\n const unreachableList = [];\n const clusters = this.clusterLatencyResults;\n\n Object.keys(clusters).forEach((key) => {\n const cluster = clusters[key];\n\n if (cluster.unreachable && !cluster.reachable) {\n unreachableList.push(key);\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Attach an event handler for the icegatheringstatechange\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private handleIceGatheringStateChange(peerConnection: RTCPeerConnection) {\n peerConnection.onicegatheringstatechange = () => {\n const {COMPLETE} = ICE_GATHERING_STATE;\n\n if (peerConnection.iceConnectionState === COMPLETE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n // @ts-ignore\n LoggerProxy.logger.log(\n // @ts-ignore\n `Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`,\n elapsed\n );\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n /**\n * Attach an event handler for the icecandidate\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private handleOnIceCandidate(peerConnection: RTCPeerConnection) {\n peerConnection.onicecandidate = (e) => {\n const SERVER_REFLEXIVE = 'srflx';\n\n if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(\n // @ts-ignore\n `Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`,\n elapsed\n );\n // order is important\n this.addPublicIP(peerConnection, e.candidate.address);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n /**\n * An event handler on an RTCPeerConnection when the state of the ICE\n * candidate gathering process changes. Used to measure connection\n * speed.\n * @private\n * @param {RTCPeerConnection} peerConnection\n * @param {number} timeout\n * @returns {Promise}\n */\n private iceGatheringState(peerConnection: RTCPeerConnection, timeout: number) {\n const ELAPSED = 'elapsed';\n\n return new Promise<ICECandidateResult>((resolve) => {\n const peerConnectionProxy = new window.Proxy(peerConnection, {\n // eslint-disable-next-line require-jsdoc\n get(target, property) {\n const targetMember = target[property];\n\n if (typeof targetMember === 'function') {\n return targetMember.bind(target);\n }\n\n return targetMember;\n },\n set: (target, property, value) => {\n // only intercept elapsed property\n if (property === ELAPSED) {\n // @ts-ignore\n resolve({clusterId: peerConnection.key, publicIPs: target.publicIPs, elapsed: value});\n\n return true;\n }\n\n // pass thru\n return window.Reflect.set(target, property, value);\n },\n });\n\n // Using peerConnection proxy so handle functions below\n // won't be coupled to our promise implementation\n this.handleIceGatheringStateChange(peerConnectionProxy);\n this.handleOnIceCandidate(peerConnectionProxy);\n\n // Set maximum timeout\n window.setTimeout(() => {\n const {CLOSED} = CONNECTION_STATE;\n\n // Close any open peerConnections\n if (peerConnectionProxy.connectionState !== CLOSED) {\n // order is important\n this.addPublicIP(peerConnectionProxy, null);\n this.setLatencyAndClose(peerConnectionProxy, null);\n }\n }, timeout);\n });\n }\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachablClusters();\n\n list.forEach((cluster) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> No ice candidate for ${cluster}.`\n );\n });\n }\n\n /**\n * Calculates time to establish connection\n * @param {Array<ICECandidateResult>} iceResults iceResults\n * @returns {object} reachabilityMap\n * @protected\n * @memberof Reachability\n */\n protected parseIceResultsToReachabilityResults(iceResults: Array<ICECandidateResult>) {\n const reachabilityMap = {};\n\n iceResults.forEach(({clusterId, elapsed, publicIPs}) => {\n const latencyResult = {};\n\n if (!elapsed) {\n Object.assign(latencyResult, {reachable: 'false'});\n } else {\n Object.assign(latencyResult, {\n reachable: 'true',\n latencyInMilliseconds: elapsed.toString(),\n });\n }\n\n if (publicIPs) {\n Object.assign(latencyResult, {\n clientMediaIPs: publicIPs,\n });\n }\n\n reachabilityMap[clusterId] = {\n udp: latencyResult,\n tcp: {untested: 'true'},\n xtls: {untested: 'true'},\n };\n });\n\n return reachabilityMap;\n }\n\n /**\n * fetches reachability data\n * @param {object} clusterList\n * @returns {Promise<localSDPData>} reachability check results\n * @private\n * @memberof Reachability\n */\n private performReachabilityCheck(clusterList: object) {\n if (!clusterList || !Object.keys(clusterList).length) {\n return Promise.resolve({});\n }\n\n return new Promise((resolve) => {\n this.getLocalSDPForClusters(clusterList)\n .then((localSDPData) => {\n if (!localSDPData || !Object.keys(localSDPData).length) {\n // TODO: handle the error condition properly and try retry\n LoggerProxy.logger.log(\n 'Reachability:index#performReachabilityCheck --> Local SDP is empty or has missing elements..returning'\n );\n resolve({});\n } else {\n resolve(localSDPData);\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Reachability:index#performReachabilityCheck --> Error in getLocalSDPForClusters: ${error}`\n );\n resolve({});\n });\n });\n }\n\n /**\n * Adds public IP (client media IPs)\n * @param {RTCPeerConnection} peerConnection\n * @param {string} publicIP\n * @returns {void}\n */\n protected addPublicIP(peerConnection: RTCPeerConnection, publicIP?: string | null) {\n const modifiedPeerConnection: RTCPeerConnection & {publicIPs?: string[]} = peerConnection;\n const {CLOSED} = CONNECTION_STATE;\n\n if (modifiedPeerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(\n `Reachability:index#addPublicIP --> Attempting to set publicIP of ${publicIP} on closed peerConnection.`\n );\n }\n\n if (publicIP) {\n if (modifiedPeerConnection.publicIPs) {\n modifiedPeerConnection.publicIPs.push(publicIP);\n } else {\n modifiedPeerConnection.publicIPs = [publicIP];\n }\n } else {\n modifiedPeerConnection.publicIPs = null;\n }\n }\n\n /**\n * Records latency and closes the peerConnection\n * @param {RTCPeerConnection} peerConnection\n * @param {number} elapsed Latency in milliseconds\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private setLatencyAndClose(peerConnection: RTCPeerConnection, elapsed: number) {\n const REACHABLE = 'reachable';\n const UNREACHABLE = 'unreachable';\n const {CLOSED} = CONNECTION_STATE;\n // @ts-ignore\n const {key} = peerConnection;\n const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;\n const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};\n\n if (peerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(\n `Reachability:index#setLatencyAndClose --> Attempting to set latency of ${elapsed} on closed peerConnection.`\n );\n\n return;\n }\n\n this.clusterLatencyResults[key] = this.clusterLatencyResults[key] || intialState;\n this.clusterLatencyResults[key][resultKey] += 1;\n\n // Set to null in case this fired from\n // an event other than onIceCandidate\n peerConnection.onicecandidate = null;\n peerConnection.close();\n // @ts-ignore\n peerConnection.elapsed = elapsed;\n }\n\n /**\n * utility function\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private setup() {\n this.clusterLatencyResults = {};\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAQA;AACA;AAEA;AAEA;AAEA,IAAMA,eAAe,GAAG,IAAI;AAC5B,IAAMC,kBAAkB,GAAG,IAAI;AAG/B;AACA;AACA;AACA;AAHA,IAIqBC,YAAY;EAM/B;AACF;AACA;AACA;AACA;EACE,sBAAYC,KAAa,EAAE;IAAA;IAAA,iDAVfC,uBAAY,CAACC,SAAS;IAAA;IAAA;IAAA;IAWhC,IAAI,CAACF,KAAK,GAAGA,KAAK;;IAElB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,IAAI,CAACG,mBAAmB,GAAG,IAAIC,gBAAmB,CAAC,IAAI,CAACJ,KAAK,CAAC;;IAE9D;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,IAAI,CAACK,qBAAqB,GAAG,CAAC,CAAC;EACjC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA;MAAA,kGAOA;QAAA;QAAA;UAAA;YAAA;cACE,IAAI,CAACC,KAAK,EAAE;;cAEZ;cACA;cAAA;cAAA,OACM,IAAI,CAACN,KAAK,CAACO,cAAc,CAACC,GAAG,CAAC,IAAI,CAACN,SAAS,EAAED,uBAAY,CAACQ,kBAAkB,CAAC;YAAA;cAAA;cAAA,OAE9E,IAAI,CAACT,KAAK,CAACO,cAAc,CAACC,GAAG,CAAC,IAAI,CAACN,SAAS,EAAED,uBAAY,CAACS,sBAAsB,CAAC;YAAA;cAAA;cAAA;cAAA,OAIjD,IAAI,CAACP,mBAAmB,CAACQ,WAAW,CACvEC,aAAW,CAACC,YAAY,CAAC,IAAI,CAACb,KAAK,CAAC,CACrC;YAAA;cAAA;cAFMc,QAAQ,yBAARA,QAAQ;cAAEC,UAAU,yBAAVA,UAAU;cAAA;cAAA,OAKL,IAAI,CAACC,wBAAwB,CAACF,QAAQ,CAAC;YAAA;cAAvDG,OAAO;cAAA;cAAA,OAGP,IAAI,CAACjB,KAAK,CAACO,cAAc,CAACW,GAAG,CACjC,IAAI,CAAChB,SAAS,EACdD,uBAAY,CAACQ,kBAAkB,EAC/B,wBAAeQ,OAAO,CAAC,CACxB;YAAA;cAAA;cAAA,OAEK,IAAI,CAACjB,KAAK,CAACO,cAAc,CAACW,GAAG,CACjC,IAAI,CAAChB,SAAS,EACdD,uBAAY,CAACS,sBAAsB,EACnC,wBAAeK,UAAU,CAAC,CAC3B;YAAA;cAEDI,oBAAW,CAACC,MAAM,CAACC,GAAG,CACpB,yEAAyE,CAC1E;cAAC,iCAEKJ,OAAO;YAAA;cAAA;cAAA;cAEdE,oBAAW,CAACC,MAAM,CAACE,KAAK,kGAEvB;cAAC,iCAEK,CAAC,CAAC;YAAA;YAAA;cAAA;UAAA;QAAA;MAAA,CAEZ;MAAA;QAAA;MAAA;MAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA;MAAA,qGAMA;QAAA;QAAA;UAAA;YAAA;cACMC,SAAS,GAAG,KAAK,EACrB;cAAA;cAAA,OAC+B,IAAI,CAACvB,KAAK,CAACO,cAAc,CACrDiB,GAAG,CAAC,IAAI,CAACtB,SAAS,EAAED,uBAAY,CAACQ,kBAAkB,CAAC,CACpDgB,KAAK,CAAC,YAAM,CAAC,CAAC,CAAC;YAAA;cAFZC,gBAAgB;cAItB,IAAIA,gBAAgB,EAAE;gBACpB,IAAI;kBACIC,mBAAmB,GAAGC,IAAI,CAACC,KAAK,CAACH,gBAAgB,CAAC;kBAExDH,SAAS,GAAG,qBAAcI,mBAAmB,CAAC,CAACG,IAAI,CACjD,UAACC,MAAW;oBAAA;oBAAA,OAAK,gBAAAA,MAAM,CAACC,GAAG,gDAAV,YAAYT,SAAS,MAAK,MAAM,IAAI,gBAAAQ,MAAM,CAACE,GAAG,gDAAV,YAAYV,SAAS,MAAK,MAAM;kBAAA,EACtF;gBACH,CAAC,CAAC,OAAOW,CAAC,EAAE;kBACVf,oBAAW,CAACC,MAAM,CAACE,KAAK,uFACyDY,CAAC,EACjF;gBACH;cACF;cAAC,kCAEMX,SAAS;YAAA;YAAA;cAAA;UAAA;QAAA;MAAA,CACjB;MAAA;QAAA;MAAA;MAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,mCAAkCY,OAAY,EAAE;MAC9C,IAAMC,UAAU,GAAG,oBAAOD,OAAO,CAACH,GAAG,CAAC,CAACK,GAAG,CAAC,UAACC,GAAG;QAAA,OAAM;UACnDC,QAAQ,EAAE,EAAE;UACZC,UAAU,EAAE,EAAE;UACdC,IAAI,EAAE,CAACH,GAAG;QACZ,CAAC;MAAA,CAAC,CAAC;MAEH,OAAO;QACLF,UAAU,mCAAMA,UAAU,CAAC;QAC3BM,oBAAoB,EAAE,GAAG;QACzBC,kBAAkB,EAAE;MACtB,CAAC;IACH;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,8BAA6BR,OAAY,EAAE;MACzC,IAAOS,GAAG,GAAYT,OAAO,CAAtBS,GAAG;QAAEC,MAAM,GAAIV,OAAO,CAAjBU,MAAM;MAElB,IAAI;QACF,IAAMC,cAAc,GAAG,IAAIC,MAAM,CAACC,iBAAiB,CAACH,MAAM,CAAC;;QAE3D;QACAC,cAAc,CAACF,GAAG,GAAGA,GAAG;QAExB,OAAOE,cAAc;MACvB,CAAC,CAAC,OAAOG,mBAAmB,EAAE;QAC5B9B,oBAAW,CAACC,MAAM,CAACC,GAAG,sFAC0D4B,mBAAmB,EAClG;QAED,OAAO,IAAI;MACb;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,wBAAuBH,cAAmB,EAAE;MAC1C,IAAMI,SAAS,GAAGJ,cAAc,CAACK,KAAK;MAEtC,OAAOL,cAAc,CAACK,KAAK;MAE3B,OAAO,mBAAU,GAAGD,SAAS;IAC/B;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,gCAA+BE,WAAmB,EAAE;MAAA;MAClD,IAAItC,QAAe,oCAAO,mBAAYsC,WAAW,CAAC,CAAC;MAEnDtC,QAAQ,GAAGA,QAAQ,CAACuB,GAAG;QAAA,mFAAC,kBAAOO,GAAG;UAAA;UAAA;YAAA;cAAA;gBAC1BT,OAAO,GAAGiB,WAAW,CAACR,GAAG,CAAC;gBAC1BC,MAAM,GAAG,KAAI,CAACQ,yBAAyB,CAAClB,OAAO,CAAC;gBAChDW,cAAc,GAAG,KAAI,CAACQ,oBAAoB,CAAC;kBAACV,GAAG,EAAHA,GAAG;kBAAEC,MAAM,EAANA;gBAAM,CAAC,CAAC;gBAAA;gBAAA,OACrCC,cAAc,CAACS,WAAW,CAAC;kBAACC,mBAAmB,EAAE;gBAAI,CAAC,CAAC;cAAA;gBAA3EC,WAAW;gBAEjB;gBACAX,cAAc,CAACK,KAAK,GAAG,mBAAU;gBACjCL,cAAc,CAACY,mBAAmB,CAACD,WAAW,CAAC;gBAAC,kCAEzC,KAAI,CAACE,iBAAiB,CAC3Bb,cAAc,EACdX,OAAO,CAACyB,WAAW,GAAG9D,kBAAkB,GAAGD,eAAe,CAC3D,CAAC4B,KAAK,CAAC,UAACoC,sBAAsB,EAAK;kBAClC1C,oBAAW,CAACC,MAAM,CAACC,GAAG,gFACoDwC,sBAAsB,EAC/F;gBACH,CAAC,CAAC;cAAA;cAAA;gBAAA;YAAA;UAAA;QAAA,CACH;QAAA;UAAA;QAAA;MAAA,IAAC;MAEF,OAAO,iBAAQC,GAAG,CAAChD,QAAQ,CAAC,CACzBiD,IAAI,CAAC,IAAI,CAACC,oCAAoC,CAAC,CAC/CD,IAAI,CAAC,UAACE,0BAA0B,EAAK;QACpC,KAAI,CAACC,sBAAsB,EAAE;;QAE7B;QACA,OAAOD,0BAA0B;MACnC,CAAC,CAAC;IACN;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,iCAAgC;MAC9B,IAAME,eAAe,GAAG,EAAE;MAC1B,IAAMrD,QAAQ,GAAG,IAAI,CAACT,qBAAqB;MAE3C,mBAAYS,QAAQ,CAAC,CAACsD,OAAO,CAAC,UAACxB,GAAG,EAAK;QACrC,IAAMT,OAAO,GAAGrB,QAAQ,CAAC8B,GAAG,CAAC;QAE7B,IAAIT,OAAO,CAACkC,WAAW,IAAI,CAAClC,OAAO,CAACZ,SAAS,EAAE;UAC7C4C,eAAe,CAACG,IAAI,CAAC1B,GAAG,CAAC;QAC3B;MACF,CAAC,CAAC;MAEF,OAAOuB,eAAe;IACxB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,uCAAsCrB,cAAiC,EAAE;MAAA;MACvEA,cAAc,CAACyB,yBAAyB,GAAG,YAAM;QAC/C,IAAOC,QAAQ,GAAIC,8BAAmB,CAA/BD,QAAQ;QAEf,IAAI1B,cAAc,CAAC4B,kBAAkB,KAAKF,QAAQ,EAAE;UAClD,IAAMG,OAAO,GAAG,MAAI,CAACC,cAAc,CAAC9B,cAAc,CAAC;;UAEnD;UACA3B,oBAAW,CAACC,MAAM,CAACC,GAAG,EACpB;UAAA,+EACwEyB,cAAc,CAACF,GAAG,QAC1F+B,OAAO,CACR;UACD,MAAI,CAACE,kBAAkB,CAAC/B,cAAc,EAAE6B,OAAO,CAAC;QAClD;MACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,8BAA6B7B,cAAiC,EAAE;MAAA;MAC9DA,cAAc,CAACgC,cAAc,GAAG,UAAC5C,CAAC,EAAK;QACrC,IAAM6C,gBAAgB,GAAG,OAAO;QAEhC,IAAI7C,CAAC,CAAC8C,SAAS,IAAIC,MAAM,CAAC/C,CAAC,CAAC8C,SAAS,CAACE,IAAI,CAAC,CAACC,WAAW,EAAE,KAAKJ,gBAAgB,EAAE;UAC9E,IAAMJ,OAAO,GAAG,MAAI,CAACC,cAAc,CAAC9B,cAAc,CAAC;UAEnD3B,oBAAW,CAACC,MAAM,CAACC,GAAG,EACpB;UAAA,oEAC6DyB,cAAc,CAACF,GAAG,QAC/E+B,OAAO,CACR;UACD;UACA,MAAI,CAACS,WAAW,CAACtC,cAAc,EAAEZ,CAAC,CAAC8C,SAAS,CAACK,OAAO,CAAC;UACrD,MAAI,CAACR,kBAAkB,CAAC/B,cAAc,EAAE6B,OAAO,CAAC;QAClD;MACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EARE;IAAA;IAAA,OASA,2BAA0B7B,cAAiC,EAAEwC,OAAe,EAAE;MAAA;MAC5E,IAAMC,OAAO,GAAG,SAAS;MAEzB,OAAO,qBAAgC,UAACC,OAAO,EAAK;QAClD,IAAMC,mBAAmB,GAAG,IAAI1C,MAAM,CAAC2C,KAAK,CAAC5C,cAAc,EAAE;UAC3D;UACAtB,GAAG,eAACmE,MAAM,EAAEC,QAAQ,EAAE;YACpB,IAAMC,YAAY,GAAGF,MAAM,CAACC,QAAQ,CAAC;YAErC,IAAI,OAAOC,YAAY,KAAK,UAAU,EAAE;cACtC,OAAOA,YAAY,CAACC,IAAI,CAACH,MAAM,CAAC;YAClC;YAEA,OAAOE,YAAY;UACrB,CAAC;UACDE,GAAG,EAAE,aAACJ,MAAM,EAAEC,QAAQ,EAAEI,KAAK,EAAK;YAChC;YACA,IAAIJ,QAAQ,KAAKL,OAAO,EAAE;cACxB;cACAC,OAAO,CAAC;gBAACS,SAAS,EAAEnD,cAAc,CAACF,GAAG;gBAAEsD,SAAS,EAAEP,MAAM,CAACO,SAAS;gBAAEvB,OAAO,EAAEqB;cAAK,CAAC,CAAC;cAErF,OAAO,IAAI;YACb;;YAEA;YACA,OAAOjD,MAAM,CAACoD,OAAO,CAACJ,GAAG,CAACJ,MAAM,EAAEC,QAAQ,EAAEI,KAAK,CAAC;UACpD;QACF,CAAC,CAAC;;QAEF;QACA;QACA,MAAI,CAACI,6BAA6B,CAACX,mBAAmB,CAAC;QACvD,MAAI,CAACY,oBAAoB,CAACZ,mBAAmB,CAAC;;QAE9C;QACA1C,MAAM,CAACuD,UAAU,CAAC,YAAM;UACtB,IAAOC,MAAM,GAAIC,2BAAgB,CAA1BD,MAAM;;UAEb;UACA,IAAId,mBAAmB,CAACgB,eAAe,KAAKF,MAAM,EAAE;YAClD;YACA,MAAI,CAACnB,WAAW,CAACK,mBAAmB,EAAE,IAAI,CAAC;YAC3C,MAAI,CAACZ,kBAAkB,CAACY,mBAAmB,EAAE,IAAI,CAAC;UACpD;QACF,CAAC,EAAEH,OAAO,CAAC;MACb,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,kCAAiC;MAC/B,IAAMoB,IAAI,GAAG,IAAI,CAACC,qBAAqB,EAAE;MAEzCD,IAAI,CAACtC,OAAO,CAAC,UAACjC,OAAO,EAAK;QACxBhB,oBAAW,CAACC,MAAM,CAACC,GAAG,8EACkDc,OAAO,OAC9E;MACH,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,8CAA+CyE,UAAqC,EAAE;MACpF,IAAMC,eAAe,GAAG,CAAC,CAAC;MAE1BD,UAAU,CAACxC,OAAO,CAAC,iBAAqC;QAAA,IAAnC6B,SAAS,SAATA,SAAS;UAAEtB,OAAO,SAAPA,OAAO;UAAEuB,SAAS,SAATA,SAAS;QAChD,IAAMY,aAAa,GAAG,CAAC,CAAC;QAExB,IAAI,CAACnC,OAAO,EAAE;UACZ,qBAAcmC,aAAa,EAAE;YAACvF,SAAS,EAAE;UAAO,CAAC,CAAC;QACpD,CAAC,MAAM;UACL,qBAAcuF,aAAa,EAAE;YAC3BvF,SAAS,EAAE,MAAM;YACjBwF,qBAAqB,EAAEpC,OAAO,CAACqC,QAAQ;UACzC,CAAC,CAAC;QACJ;QAEA,IAAId,SAAS,EAAE;UACb,qBAAcY,aAAa,EAAE;YAC3BG,cAAc,EAAEf;UAClB,CAAC,CAAC;QACJ;QAEAW,eAAe,CAACZ,SAAS,CAAC,GAAG;UAC3BjE,GAAG,EAAE8E,aAAa;UAClB7E,GAAG,EAAE;YAACiF,QAAQ,EAAE;UAAM,CAAC;UACvBC,IAAI,EAAE;YAACD,QAAQ,EAAE;UAAM;QACzB,CAAC;MACH,CAAC,CAAC;MAEF,OAAOL,eAAe;IACxB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,kCAAiCzD,WAAmB,EAAE;MAAA;MACpD,IAAI,CAACA,WAAW,IAAI,CAAC,mBAAYA,WAAW,CAAC,CAACgE,MAAM,EAAE;QACpD,OAAO,iBAAQ5B,OAAO,CAAC,CAAC,CAAC,CAAC;MAC5B;MAEA,OAAO,qBAAY,UAACA,OAAO,EAAK;QAC9B,MAAI,CAAC6B,sBAAsB,CAACjE,WAAW,CAAC,CACrCW,IAAI,CAAC,UAACuD,YAAY,EAAK;UACtB,IAAI,CAACA,YAAY,IAAI,CAAC,mBAAYA,YAAY,CAAC,CAACF,MAAM,EAAE;YACtD;YACAjG,oBAAW,CAACC,MAAM,CAACC,GAAG,CACpB,uGAAuG,CACxG;YACDmE,OAAO,CAAC,CAAC,CAAC,CAAC;UACb,CAAC,MAAM;YACLA,OAAO,CAAC8B,YAAY,CAAC;UACvB;QACF,CAAC,CAAC,CACD7F,KAAK,CAAC,UAACH,KAAK,EAAK;UAChBH,oBAAW,CAACC,MAAM,CAACE,KAAK,4FAC8DA,KAAK,EAC1F;UACDkE,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,CAAC;MACN,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,qBAAsB1C,cAAiC,EAAEyE,QAAwB,EAAE;MACjF,IAAMC,sBAAkE,GAAG1E,cAAc;MACzF,IAAOyD,MAAM,GAAIC,2BAAgB,CAA1BD,MAAM;MAEb,IAAIiB,sBAAsB,CAACf,eAAe,KAAKF,MAAM,EAAE;QACrDpF,oBAAW,CAACC,MAAM,CAACC,GAAG,4EACgDkG,QAAQ,gCAC7E;MACH;MAEA,IAAIA,QAAQ,EAAE;QACZ,IAAIC,sBAAsB,CAACtB,SAAS,EAAE;UACpCsB,sBAAsB,CAACtB,SAAS,CAAC5B,IAAI,CAACiD,QAAQ,CAAC;QACjD,CAAC,MAAM;UACLC,sBAAsB,CAACtB,SAAS,GAAG,CAACqB,QAAQ,CAAC;QAC/C;MACF,CAAC,MAAM;QACLC,sBAAsB,CAACtB,SAAS,GAAG,IAAI;MACzC;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA;IAAA,OAQA,4BAA2BpD,cAAiC,EAAE6B,OAAe,EAAE;MAAA;MAC7E,IAAM8C,SAAS,GAAG,WAAW;MAC7B,IAAMC,WAAW,GAAG,aAAa;MACjC,IAAOnB,MAAM,GAAIC,2BAAgB,CAA1BD,MAAM;MACb;MACA,IAAO3D,GAAG,GAAIE,cAAc,CAArBF,GAAG;MACV,IAAM+E,SAAS,GAAGhD,OAAO,KAAK,IAAI,GAAG+C,WAAW,GAAGD,SAAS;MAC5D,IAAMG,WAAW,mEAAKH,SAAS,EAAG,CAAC,+CAAGC,WAAW,EAAG,CAAC,gBAAC;MAEtD,IAAI5E,cAAc,CAAC2D,eAAe,KAAKF,MAAM,EAAE;QAC7CpF,oBAAW,CAACC,MAAM,CAACC,GAAG,kFACsDsD,OAAO,gCAClF;QAED;MACF;MAEA,IAAI,CAACtE,qBAAqB,CAACuC,GAAG,CAAC,GAAG,IAAI,CAACvC,qBAAqB,CAACuC,GAAG,CAAC,IAAIgF,WAAW;MAChF,IAAI,CAACvH,qBAAqB,CAACuC,GAAG,CAAC,CAAC+E,SAAS,CAAC,IAAI,CAAC;;MAE/C;MACA;MACA7E,cAAc,CAACgC,cAAc,GAAG,IAAI;MACpChC,cAAc,CAAC+E,KAAK,EAAE;MACtB;MACA/E,cAAc,CAAC6B,OAAO,GAAGA,OAAO;IAClC;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,iBAAgB;MACd,IAAI,CAACtE,qBAAqB,GAAG,CAAC,CAAC;IACjC;EAAC;EAAA;AAAA;AAAA"}
1
+ {"version":3,"names":["Reachability","webex","REACHABILITY","namespace","reachabilityRequest","ReachabilityRequest","clusterReachability","getClusters","MeetingUtil","getIpVersion","clusters","joinCookie","performReachabilityChecks","results","boundedStorage","put","localStorageResult","localStorageJoinCookie","LoggerProxy","logger","log","error","stats","reachability_public_udp_success","reachability_public_udp_failed","reachability_public_tcp_success","reachability_public_tcp_failed","reachability_vmn_udp_success","reachability_vmn_udp_failed","reachability_vmn_tcp_success","reachability_vmn_tcp_failed","updateStats","clusterType","result","udp","outcome","tcp","get","resultsJson","JSON","parse","forEach","isVideoMesh","warn","transportResult","output","key","value","reachable","untested","latencyInMilliseconds","toString","allClusterResults","clusterResult","mapTransportResultToBackendDataFormat","xtls","catch","reachabilityData","reachabilityResults","some","e","unreachableList","getResult","push","name","protocol","list","getUnreachableClusters","clusterList","length","resolve","config","meetings","experimental","enableTcpReachability","clusterReachabilityChecks","map","cluster","includeTcpReachability","ClusterReachability","start","then","all","logUnreachableClusters"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\nimport {mapValues} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {REACHABILITY} from '../constants';\n\nimport ReachabilityRequest, {ClusterList} from './request';\nimport {\n ClusterReachability,\n ClusterReachabilityResult,\n TransportResult,\n} from './clusterReachability';\n\nexport type ReachabilityMetrics = {\n reachability_public_udp_success: number;\n reachability_public_udp_failed: number;\n reachability_public_tcp_success: number;\n reachability_public_tcp_failed: number;\n reachability_vmn_udp_success: number;\n reachability_vmn_udp_failed: number;\n reachability_vmn_tcp_success: number;\n reachability_vmn_tcp_failed: number;\n};\n\n/**\n * This is the type that matches what backend expects us to send to them. It is a bit weird, because\n * it uses strings instead of booleans and numbers, but that's what they require.\n */\nexport type TransportResultForBackend = {\n reachable?: 'true' | 'false';\n latencyInMilliseconds?: string;\n clientMediaIPs?: string[];\n untested?: 'true';\n};\n\nexport type ReachabilityResultForBackend = {\n udp: TransportResultForBackend;\n tcp: TransportResultForBackend;\n xtls: TransportResultForBackend;\n};\n\n// this is the type that is required by the backend when we send them reachability results\nexport type ReachabilityResultsForBackend = Record<string, ReachabilityResultForBackend>;\n\n// this is the type used by Reachability class internally and stored in local storage\nexport type ReachabilityResults = Record<\n string,\n ClusterReachabilityResult & {\n isVideoMesh?: boolean;\n }\n>;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: ReachabilityRequest;\n clusterReachability: {\n [key: string]: ClusterReachability;\n };\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n this.clusterReachability = {};\n }\n\n /**\n * Gets a list of media clusters from the backend and performs reachability checks on all the clusters\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachability(): Promise<ReachabilityResults> {\n // Fetch clusters and measure latency\n try {\n const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(\n MeetingUtil.getIpVersion(this.webex)\n );\n\n // Perform Reachability Check\n const results = await this.performReachabilityChecks(clusters);\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n LoggerProxy.logger.log(\n 'Reachability:index#gatherReachability --> Reachability checks completed'\n );\n\n return results;\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);\n\n return {};\n }\n }\n\n /**\n * Returns statistics about last reachability results. The returned value is an object\n * with a flat list of properties so that it can be easily sent with metrics\n *\n * @returns {Promise} Promise with metrics values, it never rejects/throws.\n */\n async getReachabilityMetrics(): Promise<ReachabilityMetrics> {\n const stats: ReachabilityMetrics = {\n reachability_public_udp_success: 0,\n reachability_public_udp_failed: 0,\n reachability_public_tcp_success: 0,\n reachability_public_tcp_failed: 0,\n reachability_vmn_udp_success: 0,\n reachability_vmn_udp_failed: 0,\n reachability_vmn_tcp_success: 0,\n reachability_vmn_tcp_failed: 0,\n };\n\n const updateStats = (clusterType: 'public' | 'vmn', result: ClusterReachabilityResult) => {\n if (result.udp && result.udp.result !== 'untested') {\n const outcome = result.udp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_udp_${outcome}`] += 1;\n }\n if (result.tcp && result.tcp.result !== 'untested') {\n const outcome = result.tcp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_tcp_${outcome}`] += 1;\n }\n };\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const results: ReachabilityResults = JSON.parse(resultsJson);\n\n Object.values(results).forEach((result) => {\n updateStats(result.isVideoMesh ? 'vmn' : 'public', result);\n });\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Roap:request#getReachabilityMetrics --> Error parsing reachability data: ',\n e\n );\n }\n\n return stats;\n }\n\n /**\n * Maps our internal transport result to the format that backend expects\n * @param {TransportResult} transportResult\n * @returns {TransportResultForBackend}\n */\n private mapTransportResultToBackendDataFormat(\n transportResult: TransportResult\n ): TransportResultForBackend {\n const output: TransportResultForBackend = {};\n\n for (const [key, value] of Object.entries(transportResult)) {\n switch (key) {\n case 'result':\n switch (value) {\n case 'reachable':\n output.reachable = 'true';\n break;\n case 'unreachable':\n output.reachable = 'false';\n break;\n case 'untested':\n output.untested = 'true';\n break;\n }\n break;\n case 'latencyInMilliseconds':\n output.latencyInMilliseconds = value.toString();\n break;\n default:\n output[key] = value;\n }\n }\n\n return output;\n }\n\n /**\n * Reachability results as an object in the format that backend expects\n *\n * @returns {any} reachability results that need to be sent to the backend\n */\n async getReachabilityResults(): Promise<ReachabilityResultsForBackend | undefined> {\n let results: ReachabilityResultsForBackend;\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const allClusterResults: ReachabilityResults = JSON.parse(resultsJson);\n\n results = mapValues(allClusterResults, (clusterResult) => ({\n udp: this.mapTransportResultToBackendDataFormat(clusterResult.udp || {result: 'untested'}),\n tcp: this.mapTransportResultToBackendDataFormat(clusterResult.tcp || {result: 'untested'}),\n xtls: this.mapTransportResultToBackendDataFormat(\n clusterResult.xtls || {result: 'untested'}\n ),\n }));\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Roap:request#attachReachabilityData --> Error parsing reachability data: ',\n e\n );\n }\n\n return results;\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n async isAnyPublicClusterReachable() {\n let reachable = false;\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result) =>\n !result.isVideoMesh &&\n (result.udp?.result === 'reachable' || result.tcp?.result === 'reachable')\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return reachable;\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachableClusters(): Array<{name: string; protocol: string}> {\n const unreachableList = [];\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (result.udp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'udp'});\n }\n if (result.tcp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'tcp'});\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachableClusters();\n\n list.forEach(({name, protocol}) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> failed to reach ${name} over ${protocol}`\n );\n });\n }\n\n /**\n * Performs reachability checks for all clusters\n * @param {ClusterList} clusterList\n * @returns {Promise<ReachabilityResults>} reachability check results\n */\n private async performReachabilityChecks(clusterList: ClusterList): Promise<ReachabilityResults> {\n const results: ReachabilityResults = {};\n\n if (!clusterList || !Object.keys(clusterList).length) {\n return Promise.resolve(results);\n }\n\n LoggerProxy.logger.log(\n `Reachability:index#performReachabilityChecks --> doing UDP${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability ? ' and TCP' : ''\n } reachability checks`\n );\n\n const clusterReachabilityChecks = Object.keys(clusterList).map((key) => {\n const cluster = clusterList[key];\n\n // Linus doesn't support TCP reachability checks on video mesh nodes\n const includeTcpReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability && !cluster.isVideoMesh;\n\n if (!includeTcpReachability) {\n cluster.tcp = [];\n }\n\n this.clusterReachability[key] = new ClusterReachability(key, cluster);\n\n return this.clusterReachability[key].start().then((result) => {\n results[key] = result;\n results[key].isVideoMesh = cluster.isVideoMesh;\n });\n });\n\n await Promise.all(clusterReachabilityChecks);\n\n this.logUnreachableClusters();\n\n return results;\n }\n}\n"],"mappings":"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"}
@@ -42,7 +42,7 @@ function ReachabilityRequest(webex) {
42
42
  joinCookie = _res$body.joinCookie;
43
43
  (0, _keys.default)(clusters).forEach(function (key) {
44
44
  var _res$body$clusterClas, _res$body$clusterClas2;
45
- clusters[key].isVideoMesh = (_res$body$clusterClas = res.body.clusterClasses) === null || _res$body$clusterClas === void 0 ? void 0 : (_res$body$clusterClas2 = _res$body$clusterClas.hybridMedia) === null || _res$body$clusterClas2 === void 0 ? void 0 : _res$body$clusterClas2.includes(key);
45
+ clusters[key].isVideoMesh = !!((_res$body$clusterClas = res.body.clusterClasses) !== null && _res$body$clusterClas !== void 0 && (_res$body$clusterClas2 = _res$body$clusterClas.hybridMedia) !== null && _res$body$clusterClas2 !== void 0 && _res$body$clusterClas2.includes(key));
46
46
  });
47
47
  _loggerProxy.default.logger.log("Reachability:request#getClusters --> get clusters (ipver=".concat(ipVersion, ") successful:").concat((0, _stringify.default)(clusters)));
48
48
  return {
@@ -1 +1 @@
1
- {"version":3,"names":["ReachabilityRequest","webex","ipVersion","request","method","HTTP_VERBS","GET","shouldRefreshAccessToken","api","API","CALLIOPEDISCOVERY","resource","RESOURCE","CLUSTERS","qs","JCSupport","ipver","then","res","body","clusters","joinCookie","forEach","key","isVideoMesh","clusterClasses","hybridMedia","includes","LoggerProxy","logger","log","localSDPList","POST","REACHABILITY","offers"],"sources":["request.ts"],"sourcesContent":["import LoggerProxy from '../common/logs/logger-proxy';\nimport {HTTP_VERBS, RESOURCE, API, IP_VERSION} from '../constants';\n\nexport interface ClusterNode {\n isVideoMesh: boolean;\n udp: Array<string>;\n tcp: Array<string>;\n xtls: Array<string>;\n}\n\nexport type ClusterList = {\n [key: string]: ClusterNode;\n};\n\n/**\n * @class ReachabilityRequest\n */\nclass ReachabilityRequest {\n webex: any;\n\n /**\n * Creates an instance of ReachabilityRequest.\n * @param {object} webex\n * @memberof ReachabilityRequest\n */\n constructor(webex: object) {\n this.webex = webex;\n }\n\n /**\n * Gets the cluster information\n *\n * @param {IP_VERSION} ipVersion information about current ip network we're on\n * @returns {Promise}\n */\n getClusters = (ipVersion?: IP_VERSION): Promise<{clusters: ClusterList; joinCookie: any}> =>\n this.webex\n .request({\n method: HTTP_VERBS.GET,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.CLUSTERS,\n qs: {\n JCSupport: 1,\n ipver: ipVersion,\n },\n })\n .then((res) => {\n const {clusters, joinCookie} = res.body;\n\n Object.keys(clusters).forEach((key) => {\n clusters[key].isVideoMesh = res.body.clusterClasses?.hybridMedia?.includes(key);\n });\n\n LoggerProxy.logger.log(\n `Reachability:request#getClusters --> get clusters (ipver=${ipVersion}) successful:${JSON.stringify(\n clusters\n )}`\n );\n\n return {\n clusters,\n joinCookie,\n };\n });\n\n /**\n * gets remote SDP For Clusters\n * @param {Object} localSDPList localSDPs for the cluster\n * @returns {Object}\n */\n remoteSDPForClusters = (localSDPList: object) =>\n this.webex\n .request({\n method: HTTP_VERBS.POST,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.REACHABILITY,\n body: {offers: localSDPList},\n })\n .then((res) => {\n LoggerProxy.logger.log(\n 'Reachability:request#remoteSDPForClusters --> Remote SDPs got succcessfully'\n );\n\n return res.body;\n });\n}\n\nexport default ReachabilityRequest;\n"],"mappings":";;;;;;;;;;;;;AAAA;AACA;AAaA;AACA;AACA;AAFA,IAGMA,mBAAmB;AAGvB;AACF;AACA;AACA;AACA;AACE,6BAAYC,KAAa,EAAE;EAAA;EAAA;EAAA;EAAA,mDAUb,UAACC,SAAsB;IAAA,OACnC,KAAI,CAACD,KAAK,CACPE,OAAO,CAAC;MACPC,MAAM,EAAEC,qBAAU,CAACC,GAAG;MACtBC,wBAAwB,EAAE,KAAK;MAC/BC,GAAG,EAAEC,cAAG,CAACC,iBAAiB;MAC1BC,QAAQ,EAAEC,mBAAQ,CAACC,QAAQ;MAC3BC,EAAE,EAAE;QACFC,SAAS,EAAE,CAAC;QACZC,KAAK,EAAEd;MACT;IACF,CAAC,CAAC,CACDe,IAAI,CAAC,UAACC,GAAG,EAAK;MACb,gBAA+BA,GAAG,CAACC,IAAI;QAAhCC,QAAQ,aAARA,QAAQ;QAAEC,UAAU,aAAVA,UAAU;MAE3B,mBAAYD,QAAQ,CAAC,CAACE,OAAO,CAAC,UAACC,GAAG,EAAK;QAAA;QACrCH,QAAQ,CAACG,GAAG,CAAC,CAACC,WAAW,4BAAGN,GAAG,CAACC,IAAI,CAACM,cAAc,oFAAvB,sBAAyBC,WAAW,2DAApC,uBAAsCC,QAAQ,CAACJ,GAAG,CAAC;MACjF,CAAC,CAAC;MAEFK,oBAAW,CAACC,MAAM,CAACC,GAAG,oEACwC5B,SAAS,0BAAgB,wBACnFkB,QAAQ,CACT,EACF;MAED,OAAO;QACLA,QAAQ,EAARA,QAAQ;QACRC,UAAU,EAAVA;MACF,CAAC;IACH,CAAC,CAAC;EAAA;EAAA,4DAOiB,UAACU,YAAoB;IAAA,OAC1C,KAAI,CAAC9B,KAAK,CACPE,OAAO,CAAC;MACPC,MAAM,EAAEC,qBAAU,CAAC2B,IAAI;MACvBzB,wBAAwB,EAAE,KAAK;MAC/BC,GAAG,EAAEC,cAAG,CAACC,iBAAiB;MAC1BC,QAAQ,EAAEC,mBAAQ,CAACqB,YAAY;MAC/Bd,IAAI,EAAE;QAACe,MAAM,EAAEH;MAAY;IAC7B,CAAC,CAAC,CACDd,IAAI,CAAC,UAACC,GAAG,EAAK;MACbU,oBAAW,CAACC,MAAM,CAACC,GAAG,CACpB,6EAA6E,CAC9E;MAED,OAAOZ,GAAG,CAACC,IAAI;IACjB,CAAC,CAAC;EAAA;EA5DJ,IAAI,CAAClB,KAAK,GAAGA,KAAK;AACpB;;AAEA;AACF;AACA;AACA;AACA;AACA,GALE;AAAA,eA4DaD,mBAAmB;AAAA"}
1
+ {"version":3,"names":["ReachabilityRequest","webex","ipVersion","request","method","HTTP_VERBS","GET","shouldRefreshAccessToken","api","API","CALLIOPEDISCOVERY","resource","RESOURCE","CLUSTERS","qs","JCSupport","ipver","then","res","body","clusters","joinCookie","forEach","key","isVideoMesh","clusterClasses","hybridMedia","includes","LoggerProxy","logger","log","localSDPList","POST","REACHABILITY","offers"],"sources":["request.ts"],"sourcesContent":["import LoggerProxy from '../common/logs/logger-proxy';\nimport {HTTP_VERBS, RESOURCE, API, IP_VERSION} from '../constants';\n\nexport interface ClusterNode {\n isVideoMesh: boolean;\n udp: Array<string>;\n tcp: Array<string>;\n xtls: Array<string>;\n}\n\nexport type ClusterList = {\n [key: string]: ClusterNode;\n};\n\n/**\n * @class ReachabilityRequest\n */\nclass ReachabilityRequest {\n webex: any;\n\n /**\n * Creates an instance of ReachabilityRequest.\n * @param {object} webex\n * @memberof ReachabilityRequest\n */\n constructor(webex: object) {\n this.webex = webex;\n }\n\n /**\n * Gets the cluster information\n *\n * @param {IP_VERSION} ipVersion information about current ip network we're on\n * @returns {Promise}\n */\n getClusters = (ipVersion?: IP_VERSION): Promise<{clusters: ClusterList; joinCookie: any}> =>\n this.webex\n .request({\n method: HTTP_VERBS.GET,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.CLUSTERS,\n qs: {\n JCSupport: 1,\n ipver: ipVersion,\n },\n })\n .then((res) => {\n const {clusters, joinCookie} = res.body;\n\n Object.keys(clusters).forEach((key) => {\n clusters[key].isVideoMesh = !!res.body.clusterClasses?.hybridMedia?.includes(key);\n });\n\n LoggerProxy.logger.log(\n `Reachability:request#getClusters --> get clusters (ipver=${ipVersion}) successful:${JSON.stringify(\n clusters\n )}`\n );\n\n return {\n clusters,\n joinCookie,\n };\n });\n\n /**\n * gets remote SDP For Clusters\n * @param {Object} localSDPList localSDPs for the cluster\n * @returns {Object}\n */\n remoteSDPForClusters = (localSDPList: object) =>\n this.webex\n .request({\n method: HTTP_VERBS.POST,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.REACHABILITY,\n body: {offers: localSDPList},\n })\n .then((res) => {\n LoggerProxy.logger.log(\n 'Reachability:request#remoteSDPForClusters --> Remote SDPs got succcessfully'\n );\n\n return res.body;\n });\n}\n\nexport default ReachabilityRequest;\n"],"mappings":";;;;;;;;;;;;;AAAA;AACA;AAaA;AACA;AACA;AAFA,IAGMA,mBAAmB;AAGvB;AACF;AACA;AACA;AACA;AACE,6BAAYC,KAAa,EAAE;EAAA;EAAA;EAAA;EAAA,mDAUb,UAACC,SAAsB;IAAA,OACnC,KAAI,CAACD,KAAK,CACPE,OAAO,CAAC;MACPC,MAAM,EAAEC,qBAAU,CAACC,GAAG;MACtBC,wBAAwB,EAAE,KAAK;MAC/BC,GAAG,EAAEC,cAAG,CAACC,iBAAiB;MAC1BC,QAAQ,EAAEC,mBAAQ,CAACC,QAAQ;MAC3BC,EAAE,EAAE;QACFC,SAAS,EAAE,CAAC;QACZC,KAAK,EAAEd;MACT;IACF,CAAC,CAAC,CACDe,IAAI,CAAC,UAACC,GAAG,EAAK;MACb,gBAA+BA,GAAG,CAACC,IAAI;QAAhCC,QAAQ,aAARA,QAAQ;QAAEC,UAAU,aAAVA,UAAU;MAE3B,mBAAYD,QAAQ,CAAC,CAACE,OAAO,CAAC,UAACC,GAAG,EAAK;QAAA;QACrCH,QAAQ,CAACG,GAAG,CAAC,CAACC,WAAW,GAAG,CAAC,2BAACN,GAAG,CAACC,IAAI,CAACM,cAAc,4EAAvB,sBAAyBC,WAAW,mDAApC,uBAAsCC,QAAQ,CAACJ,GAAG,CAAC;MACnF,CAAC,CAAC;MAEFK,oBAAW,CAACC,MAAM,CAACC,GAAG,oEACwC5B,SAAS,0BAAgB,wBACnFkB,QAAQ,CACT,EACF;MAED,OAAO;QACLA,QAAQ,EAARA,QAAQ;QACRC,UAAU,EAAVA;MACF,CAAC;IACH,CAAC,CAAC;EAAA;EAAA,4DAOiB,UAACU,YAAoB;IAAA,OAC1C,KAAI,CAAC9B,KAAK,CACPE,OAAO,CAAC;MACPC,MAAM,EAAEC,qBAAU,CAAC2B,IAAI;MACvBzB,wBAAwB,EAAE,KAAK;MAC/BC,GAAG,EAAEC,cAAG,CAACC,iBAAiB;MAC1BC,QAAQ,EAAEC,mBAAQ,CAACqB,YAAY;MAC/Bd,IAAI,EAAE;QAACe,MAAM,EAAEH;MAAY;IAC7B,CAAC,CAAC,CACDd,IAAI,CAAC,UAACC,GAAG,EAAK;MACbU,oBAAW,CAACC,MAAM,CAACC,GAAG,CACpB,6EAA6E,CAC9E;MAED,OAAOZ,GAAG,CAACC,IAAI;IACjB,CAAC,CAAC;EAAA;EA5DJ,IAAI,CAAClB,KAAK,GAAGA,KAAK;AACpB;;AAEA;AACF;AACA;AACA;AACA;AACA,GALE;AAAA,eA4DaD,mBAAmB;AAAA"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ _Object$defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.convertStunUrlToTurn = convertStunUrlToTurn;
8
+ /* eslint-disable import/prefer-default-export */
9
+ /**
10
+ * Converts a stun url to a turn url
11
+ *
12
+ * @param {string} stunUrl url of a stun server
13
+ * @param {'tcp'|'udp'} protocol what protocol to use for the turn server
14
+ * @returns {string} url of a turn server
15
+ */
16
+ function convertStunUrlToTurn(stunUrl, protocol) {
17
+ // stunUrl looks like this: "stun:external-media91.public.wjfkm-a-10.prod.infra.webex.com:5004"
18
+ // and we need it to be like this: "turn:external-media91.public.wjfkm-a-10.prod.infra.webex.com:5004?transport=tcp"
19
+ var url = new URL(stunUrl);
20
+ if (url.protocol !== 'stun:') {
21
+ throw new Error("Not a STUN URL: ".concat(stunUrl));
22
+ }
23
+ url.protocol = 'turn:';
24
+ if (protocol === 'tcp') {
25
+ url.searchParams.append('transport', 'tcp');
26
+ }
27
+ return url.toString();
28
+ }
29
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["convertStunUrlToTurn","stunUrl","protocol","url","URL","Error","searchParams","append","toString"],"sources":["util.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\n/**\n * Converts a stun url to a turn url\n *\n * @param {string} stunUrl url of a stun server\n * @param {'tcp'|'udp'} protocol what protocol to use for the turn server\n * @returns {string} url of a turn server\n */\nexport function convertStunUrlToTurn(stunUrl: string, protocol: 'udp' | 'tcp') {\n // stunUrl looks like this: \"stun:external-media91.public.wjfkm-a-10.prod.infra.webex.com:5004\"\n // and we need it to be like this: \"turn:external-media91.public.wjfkm-a-10.prod.infra.webex.com:5004?transport=tcp\"\n const url = new URL(stunUrl);\n\n if (url.protocol !== 'stun:') {\n throw new Error(`Not a STUN URL: ${stunUrl}`);\n }\n\n url.protocol = 'turn:';\n if (protocol === 'tcp') {\n url.searchParams.append('transport', 'tcp');\n }\n\n return url.toString();\n}\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,oBAAoB,CAACC,OAAe,EAAEC,QAAuB,EAAE;EAC7E;EACA;EACA,IAAMC,GAAG,GAAG,IAAIC,GAAG,CAACH,OAAO,CAAC;EAE5B,IAAIE,GAAG,CAACD,QAAQ,KAAK,OAAO,EAAE;IAC5B,MAAM,IAAIG,KAAK,2BAAoBJ,OAAO,EAAG;EAC/C;EAEAE,GAAG,CAACD,QAAQ,GAAG,OAAO;EACtB,IAAIA,QAAQ,KAAK,KAAK,EAAE;IACtBC,GAAG,CAACG,YAAY,CAACC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC;EAC7C;EAEA,OAAOJ,GAAG,CAACK,QAAQ,EAAE;AACvB"}
@@ -23,9 +23,9 @@ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy")
23
23
  var _triggerProxy = _interopRequireDefault(require("../common/events/trigger-proxy"));
24
24
  var _constants = require("../constants");
25
25
  var _constants2 = _interopRequireDefault(require("../metrics/constants"));
26
- var _reconnection = _interopRequireDefault(require("../common/errors/reconnection"));
27
26
  var _reconnectionInProgress = _interopRequireDefault(require("../common/errors/reconnection-in-progress"));
28
27
  var _metrics = _interopRequireDefault(require("../metrics"));
28
+ var _reconnection = _interopRequireDefault(require("../common/errors/reconnection"));
29
29
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
30
30
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
31
31
  /**
@@ -110,7 +110,7 @@ var ReconnectionManager = /*#__PURE__*/function () {
110
110
 
111
111
  /**
112
112
  * @instance
113
- * @type {String}
113
+ * @type {RECONNECTION_STATE}
114
114
  * @private
115
115
  * @memberof ReconnectionManager
116
116
  */
@@ -242,7 +242,6 @@ var ReconnectionManager = /*#__PURE__*/function () {
242
242
  key: "cleanUp",
243
243
  value: function cleanUp() {
244
244
  this.reset();
245
- this.meeting = null;
246
245
  }
247
246
 
248
247
  /**
@@ -291,6 +290,20 @@ var ReconnectionManager = /*#__PURE__*/function () {
291
290
  return this.status === _constants.RECONNECTION.STATE.IN_PROGRESS;
292
291
  }
293
292
 
293
+ /**
294
+ * Sets the reconnection status
295
+ *
296
+ * @public
297
+ * @param {RECONNECTION_STATE} status
298
+ * @memberof ReconnectionManager
299
+ * @returns {undefined}
300
+ */
301
+ }, {
302
+ key: "setStatus",
303
+ value: function setStatus(status) {
304
+ this.status = status;
305
+ }
306
+
294
307
  /**
295
308
  * @returns {Boolean}
296
309
  * @throws {ReconnectionError}
@@ -324,12 +337,12 @@ var ReconnectionManager = /*#__PURE__*/function () {
324
337
  key: "reconnect",
325
338
  value: function () {
326
339
  var _reconnect = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
327
- var _this3 = this;
328
340
  var _ref2,
329
341
  _ref2$networkDisconne,
330
342
  networkDisconnect,
331
343
  _ref2$networkRetry,
332
344
  networkRetry,
345
+ media,
333
346
  _args2 = arguments;
334
347
  return _regenerator.default.wrap(function _callee2$(_context2) {
335
348
  while (1) switch (_context2.prev = _context2.next) {
@@ -359,69 +372,75 @@ var ReconnectionManager = /*#__PURE__*/function () {
359
372
  }
360
373
  });
361
374
  }
362
- return _context2.abrupt("return", this.executeReconnection({
375
+ _context2.prev = 11;
376
+ _context2.next = 14;
377
+ return this.webex.meetings.startReachability();
378
+ case 14:
379
+ _context2.next = 19;
380
+ break;
381
+ case 16:
382
+ _context2.prev = 16;
383
+ _context2.t1 = _context2["catch"](11);
384
+ _loggerProxy.default.logger.info('ReconnectionManager:index#reconnect --> Reachability failed, continuing with reconnection attempt, err: ', _context2.t1);
385
+ case 19:
386
+ _context2.prev = 19;
387
+ _context2.next = 22;
388
+ return this.executeReconnection({
363
389
  networkDisconnect: networkDisconnect
364
- }).then(function () {
365
- _loggerProxy.default.logger.info('ReconnectionManager:index#reconnect --> Reconnection successful.');
366
- _loggerProxy.default.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect success metric.');
367
-
368
- // @ts-ignore
369
- _this3.webex.internal.newMetrics.submitClientEvent({
370
- name: 'client.media.recovered',
371
- payload: {
372
- recoveredBy: 'new'
373
- },
374
- options: {
375
- meetingId: _this3.meeting.id
376
- }
377
- });
378
- }).catch(function (reconnectError) {
379
- if (reconnectError instanceof NeedsRetryError) {
380
- _loggerProxy.default.logger.info('ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.');
381
- // Reset our reconnect status since we are looping back to the beginning
382
- _this3.status = _constants.RECONNECTION.STATE.DEFAULT_STATUS;
383
-
384
- // This is a network retry, so we should not log START metrics again
385
- return _this3.reconnect({
386
- networkDisconnect: true,
387
- networkRetry: true
388
- });
389
- }
390
-
391
- // Reconnect has failed
392
- _loggerProxy.default.logger.error('ReconnectionManager:index#reconnect --> Reconnection failed.', reconnectError.message);
393
- _loggerProxy.default.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect abort metric.');
390
+ });
391
+ case 22:
392
+ media = _context2.sent;
393
+ return _context2.abrupt("return", media);
394
+ case 26:
395
+ _context2.prev = 26;
396
+ _context2.t2 = _context2["catch"](19);
397
+ if (!(_context2.t2 instanceof NeedsRetryError)) {
398
+ _context2.next = 32;
399
+ break;
400
+ }
401
+ _loggerProxy.default.logger.info('ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.');
402
+ // Reset our reconnect status since we are looping back to the beginning
403
+ this.status = _constants.RECONNECTION.STATE.DEFAULT_STATUS;
394
404
 
395
- // @ts-ignore
396
- _this3.webex.internal.newMetrics.submitClientEvent({
397
- name: 'client.call.aborted',
398
- payload: {
399
- errors: [{
400
- category: 'expected',
401
- errorCode: 2008,
402
- fatal: true,
403
- name: 'media-engine',
404
- shownToUser: false
405
- }]
406
- },
407
- options: {
408
- meetingId: _this3.meeting.id
409
- }
410
- });
411
- if (reconnectError instanceof NeedsRejoinError) {
412
- // send call aborded event with catogery as expected as we are trying to rejoin
405
+ // This is a network retry, so we should not log START metrics again
406
+ return _context2.abrupt("return", this.reconnect({
407
+ networkDisconnect: true,
408
+ networkRetry: true
409
+ }));
410
+ case 32:
411
+ // Reconnect has failed
412
+ _loggerProxy.default.logger.error('ReconnectionManager:index#reconnect --> Reconnection failed.', _context2.t2.message);
413
+ _loggerProxy.default.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect abort metric.');
413
414
 
414
- if (_this3.autoRejoinEnabled) {
415
- return _this3.rejoinMeeting(reconnectError.wasSharing);
416
- }
415
+ // send call aborted event with catogery as expected as we are trying to rejoin
416
+ // @ts-ignore
417
+ this.webex.internal.newMetrics.submitClientEvent({
418
+ name: 'client.call.aborted',
419
+ payload: {
420
+ errors: [{
421
+ category: 'expected',
422
+ errorCode: 2008,
423
+ fatal: true,
424
+ name: 'media-engine',
425
+ shownToUser: false
426
+ }]
427
+ },
428
+ options: {
429
+ meetingId: this.meeting.id
417
430
  }
418
- throw reconnectError;
419
- }));
420
- case 12:
431
+ });
432
+ if (!(_context2.t2 instanceof NeedsRejoinError && this.autoRejoinEnabled)) {
433
+ _context2.next = 37;
434
+ break;
435
+ }
436
+ return _context2.abrupt("return", this.rejoinMeeting(_context2.t2.wasSharing));
437
+ case 37:
438
+ throw _context2.t2;
439
+ case 38:
421
440
  case "end":
422
441
  return _context2.stop();
423
442
  }
424
- }, _callee2, this, [[2, 6]]);
443
+ }, _callee2, this, [[2, 6], [11, 16], [19, 26]]);
425
444
  }));
426
445
  function reconnect() {
427
446
  return _reconnect.apply(this, arguments);
@@ -473,66 +492,63 @@ var ReconnectionManager = /*#__PURE__*/function () {
473
492
  this.status = _constants.RECONNECTION.STATE.FAILURE;
474
493
  throw _context3.t0;
475
494
  case 19:
476
- if (this.webex.credentials.isUnverifiedGuest) {
477
- _context3.next = 30;
478
- break;
479
- }
480
- _context3.prev = 20;
495
+ _context3.prev = 19;
481
496
  _loggerProxy.default.logger.info('ReconnectionManager:index#executeReconnection --> Updating meeting data from server.');
482
- _context3.next = 24;
483
- return this.webex.meetings.syncMeetings();
484
- case 24:
485
- _context3.next = 30;
497
+ _context3.next = 23;
498
+ return this.webex.meetings.syncMeetings({
499
+ keepOnlyLocusMeetings: false
500
+ });
501
+ case 23:
502
+ _context3.next = 29;
486
503
  break;
487
- case 26:
488
- _context3.prev = 26;
489
- _context3.t1 = _context3["catch"](20);
504
+ case 25:
505
+ _context3.prev = 25;
506
+ _context3.t1 = _context3["catch"](19);
490
507
  _loggerProxy.default.logger.info('ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.', _context3.t1);
491
508
  throw new NeedsRetryError(_context3.t1);
492
- case 30:
509
+ case 29:
493
510
  if (!(!this.meeting || !this.webex.meetings.getMeetingByType(_constants._ID_, this.meeting.id))) {
494
- _context3.next = 33;
511
+ _context3.next = 32;
495
512
  break;
496
513
  }
497
514
  _loggerProxy.default.logger.info('ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely.');
498
515
  throw new Error('Unable to rejoin a meeting already ended or inactive.');
499
- case 33:
516
+ case 32:
500
517
  _loggerProxy.default.logger.info("ReconnectionManager:index#executeReconnection --> Current state of meeting is ".concat(this.meeting.state));
501
518
 
502
519
  // If the meeting state was left, no longer reconnect media
503
520
  if (!(this.meeting.state === _constants._LEFT_)) {
504
- _context3.next = 38;
521
+ _context3.next = 37;
505
522
  break;
506
523
  }
507
524
  if (!(this.meeting.type === _constants._CALL_)) {
508
- _context3.next = 37;
525
+ _context3.next = 36;
509
526
  break;
510
527
  }
511
528
  throw new Error('Unable to rejoin a call in LEFT state.');
512
- case 37:
529
+ case 36:
513
530
  throw new NeedsRejoinError({
514
531
  wasSharing: wasSharing
515
532
  });
516
- case 38:
517
- _context3.prev = 38;
518
- _context3.next = 41;
533
+ case 37:
534
+ _context3.prev = 37;
535
+ _context3.next = 40;
519
536
  return this.reconnectMedia();
520
- case 41:
537
+ case 40:
521
538
  media = _context3.sent;
522
- _loggerProxy.default.logger.log('ReconnectionManager:index#executeReconnection --> Media reestablished');
523
- this.status = _constants.RECONNECTION.STATE.COMPLETE;
539
+ _loggerProxy.default.logger.log('ReconnectionManager:index#executeReconnection --> webRTC media connection renewed and local sdp offer sent');
524
540
  return _context3.abrupt("return", media);
525
- case 47:
526
- _context3.prev = 47;
527
- _context3.t2 = _context3["catch"](38);
528
- _loggerProxy.default.logger.error('ReconnectionManager:index#executeReconnection --> Media reestablishment failed');
541
+ case 45:
542
+ _context3.prev = 45;
543
+ _context3.t2 = _context3["catch"](37);
544
+ _loggerProxy.default.logger.error('ReconnectionManager:index#executeReconnection --> failed to renew webRTC media connection or initiate offer');
529
545
  this.status = _constants.RECONNECTION.STATE.FAILURE;
530
546
  throw _context3.t2;
531
- case 52:
547
+ case 50:
532
548
  case "end":
533
549
  return _context3.stop();
534
550
  }
535
- }, _callee3, this, [[8, 14], [20, 26], [38, 47]]);
551
+ }, _callee3, this, [[8, 14], [19, 25], [37, 45]]);
536
552
  }));
537
553
  function executeReconnection(_x2) {
538
554
  return _executeReconnection.apply(this, arguments);
@@ -630,11 +646,11 @@ var ReconnectionManager = /*#__PURE__*/function () {
630
646
  return _regenerator.default.wrap(function _callee5$(_context5) {
631
647
  while (1) switch (_context5.prev = _context5.next) {
632
648
  case 0:
633
- _loggerProxy.default.logger.log('ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media');
649
+ _loggerProxy.default.logger.log('ReconnectionManager:index#reconnectMedia --> do turn discovery');
634
650
 
635
- // do the TURN server discovery again since the TURN server might change
651
+ // do the TURN server discovery again and ignore reachability results since the TURN server might change
636
652
  _context5.next = 3;
637
- return this.meeting.roap.doTurnDiscovery(this.meeting, true);
653
+ return this.meeting.roap.doTurnDiscovery(this.meeting, true, true);
638
654
  case 3:
639
655
  turnServerResult = _context5.sent;
640
656
  iceServers = [];
@@ -645,9 +661,10 @@ var ReconnectionManager = /*#__PURE__*/function () {
645
661
  credential: turnServerResult.turnServerInfo.password || ''
646
662
  });
647
663
  }
648
- _context5.next = 8;
664
+ _loggerProxy.default.logger.log('ReconnectionManager:index#reconnectMedia --> renew webRTC media connection and send local sdp offer');
665
+ _context5.next = 9;
649
666
  return this.meeting.mediaProperties.webrtcMediaConnection.reconnect(iceServers);
650
- case 8:
667
+ case 9:
651
668
  // resend media requests
652
669
  if (this.meeting.isMultistream) {
653
670
  (0, _values.default)(this.meeting.mediaRequestManagers).forEach(function (mediaRequestManager) {
@@ -655,7 +672,7 @@ var ReconnectionManager = /*#__PURE__*/function () {
655
672
  mediaRequestManager.commit();
656
673
  });
657
674
  }
658
- case 9:
675
+ case 10:
659
676
  case "end":
660
677
  return _context5.stop();
661
678
  }