@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.104

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 (548) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.js +48 -0
  6. package/dist/annotation/constants.js.map +1 -0
  7. package/dist/annotation/index.js +357 -0
  8. package/dist/annotation/index.js.map +1 -0
  9. package/dist/breakouts/breakout.js +176 -0
  10. package/dist/breakouts/breakout.js.map +1 -0
  11. package/dist/breakouts/collection.js +23 -0
  12. package/dist/breakouts/collection.js.map +1 -0
  13. package/dist/breakouts/edit-lock-error.js +52 -0
  14. package/dist/breakouts/edit-lock-error.js.map +1 -0
  15. package/dist/breakouts/events.js +43 -0
  16. package/dist/breakouts/events.js.map +1 -0
  17. package/dist/breakouts/index.js +919 -0
  18. package/dist/breakouts/index.js.map +1 -0
  19. package/dist/breakouts/request.js +78 -0
  20. package/dist/breakouts/request.js.map +1 -0
  21. package/dist/breakouts/utils.js +67 -0
  22. package/dist/breakouts/utils.js.map +1 -0
  23. package/dist/common/browser-detection.js +1 -20
  24. package/dist/common/browser-detection.js.map +1 -1
  25. package/dist/common/collection.js +5 -20
  26. package/dist/common/collection.js.map +1 -1
  27. package/dist/common/config.js +0 -7
  28. package/dist/common/config.js.map +1 -1
  29. package/dist/common/errors/captcha-error.js +10 -24
  30. package/dist/common/errors/captcha-error.js.map +1 -1
  31. package/dist/common/errors/intent-to-join.js +11 -24
  32. package/dist/common/errors/intent-to-join.js.map +1 -1
  33. package/dist/common/errors/join-meeting.js +12 -25
  34. package/dist/common/errors/join-meeting.js.map +1 -1
  35. package/dist/common/errors/media.js +10 -24
  36. package/dist/common/errors/media.js.map +1 -1
  37. package/dist/common/errors/parameter.js +5 -33
  38. package/dist/common/errors/parameter.js.map +1 -1
  39. package/dist/common/errors/password-error.js +10 -24
  40. package/dist/common/errors/password-error.js.map +1 -1
  41. package/dist/common/errors/permission.js +9 -23
  42. package/dist/common/errors/permission.js.map +1 -1
  43. package/dist/common/errors/reconnection-in-progress.js +0 -17
  44. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  45. package/dist/common/errors/reconnection.js +10 -24
  46. package/dist/common/errors/reconnection.js.map +1 -1
  47. package/dist/common/errors/stats.js +10 -24
  48. package/dist/common/errors/stats.js.map +1 -1
  49. package/dist/common/errors/webex-errors.js +10 -69
  50. package/dist/common/errors/webex-errors.js.map +1 -1
  51. package/dist/common/errors/webex-meetings-error.js +5 -25
  52. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  53. package/dist/common/events/events-scope.js +0 -22
  54. package/dist/common/events/events-scope.js.map +1 -1
  55. package/dist/common/events/events.js +0 -23
  56. package/dist/common/events/events.js.map +1 -1
  57. package/dist/common/events/trigger-proxy.js +0 -12
  58. package/dist/common/events/trigger-proxy.js.map +1 -1
  59. package/dist/common/events/util.js +0 -15
  60. package/dist/common/events/util.js.map +1 -1
  61. package/dist/common/logs/logger-config.js +0 -4
  62. package/dist/common/logs/logger-config.js.map +1 -1
  63. package/dist/common/logs/logger-proxy.js +1 -8
  64. package/dist/common/logs/logger-proxy.js.map +1 -1
  65. package/dist/common/logs/request.js +37 -60
  66. package/dist/common/logs/request.js.map +1 -1
  67. package/dist/common/queue.js +4 -14
  68. package/dist/common/queue.js.map +1 -1
  69. package/dist/config.js +7 -6
  70. package/dist/config.js.map +1 -1
  71. package/dist/constants.js +184 -122
  72. package/dist/constants.js.map +1 -1
  73. package/dist/controls-options-manager/constants.js +14 -0
  74. package/dist/controls-options-manager/constants.js.map +1 -0
  75. package/dist/controls-options-manager/enums.js +25 -0
  76. package/dist/controls-options-manager/enums.js.map +1 -0
  77. package/dist/controls-options-manager/index.js +297 -0
  78. package/dist/controls-options-manager/index.js.map +1 -0
  79. package/dist/controls-options-manager/types.js +7 -0
  80. package/dist/controls-options-manager/types.js.map +1 -0
  81. package/dist/controls-options-manager/util.js +250 -0
  82. package/dist/controls-options-manager/util.js.map +1 -0
  83. package/dist/index.js +72 -17
  84. package/dist/index.js.map +1 -1
  85. package/dist/locus-info/controlsUtils.js +56 -29
  86. package/dist/locus-info/controlsUtils.js.map +1 -1
  87. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  88. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  89. package/dist/locus-info/fullState.js +0 -15
  90. package/dist/locus-info/fullState.js.map +1 -1
  91. package/dist/locus-info/hostUtils.js +4 -12
  92. package/dist/locus-info/hostUtils.js.map +1 -1
  93. package/dist/locus-info/index.js +362 -208
  94. package/dist/locus-info/index.js.map +1 -1
  95. package/dist/locus-info/infoUtils.js +3 -37
  96. package/dist/locus-info/infoUtils.js.map +1 -1
  97. package/dist/locus-info/mediaSharesUtils.js +12 -38
  98. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  99. package/dist/locus-info/parser.js +92 -118
  100. package/dist/locus-info/parser.js.map +1 -1
  101. package/dist/locus-info/selfUtils.js +99 -91
  102. package/dist/locus-info/selfUtils.js.map +1 -1
  103. package/dist/media/index.js +113 -337
  104. package/dist/media/index.js.map +1 -1
  105. package/dist/media/properties.js +96 -135
  106. package/dist/media/properties.js.map +1 -1
  107. package/dist/media/util.js +1 -35
  108. package/dist/media/util.js.map +1 -1
  109. package/dist/mediaQualityMetrics/config.js +505 -495
  110. package/dist/mediaQualityMetrics/config.js.map +1 -1
  111. package/dist/meeting/in-meeting-actions.js +59 -14
  112. package/dist/meeting/in-meeting-actions.js.map +1 -1
  113. package/dist/meeting/index.js +2909 -2398
  114. package/dist/meeting/index.js.map +1 -1
  115. package/dist/meeting/muteState.js +257 -112
  116. package/dist/meeting/muteState.js.map +1 -1
  117. package/dist/meeting/request.js +330 -264
  118. package/dist/meeting/request.js.map +1 -1
  119. package/dist/meeting/request.type.js +7 -0
  120. package/dist/meeting/request.type.js.map +1 -0
  121. package/dist/meeting/state.js +21 -31
  122. package/dist/meeting/state.js.map +1 -1
  123. package/dist/meeting/util.js +63 -261
  124. package/dist/meeting/util.js.map +1 -1
  125. package/dist/meeting-info/collection.js +6 -25
  126. package/dist/meeting-info/collection.js.map +1 -1
  127. package/dist/meeting-info/index.js +14 -32
  128. package/dist/meeting-info/index.js.map +1 -1
  129. package/dist/meeting-info/meeting-info-v2.js +273 -280
  130. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  131. package/dist/meeting-info/request.js +3 -15
  132. package/dist/meeting-info/request.js.map +1 -1
  133. package/dist/meeting-info/util.js +98 -183
  134. package/dist/meeting-info/util.js.map +1 -1
  135. package/dist/meeting-info/utilv2.js +155 -232
  136. package/dist/meeting-info/utilv2.js.map +1 -1
  137. package/dist/meetings/collection.js +26 -19
  138. package/dist/meetings/collection.js.map +1 -1
  139. package/dist/meetings/index.js +741 -548
  140. package/dist/meetings/index.js.map +1 -1
  141. package/dist/meetings/request.js +26 -41
  142. package/dist/meetings/request.js.map +1 -1
  143. package/dist/meetings/util.js +194 -149
  144. package/dist/meetings/util.js.map +1 -1
  145. package/dist/member/index.js +100 -85
  146. package/dist/member/index.js.map +1 -1
  147. package/dist/member/types.js +15 -0
  148. package/dist/member/types.js.map +1 -0
  149. package/dist/member/util.js +90 -68
  150. package/dist/member/util.js.map +1 -1
  151. package/dist/members/collection.js +13 -12
  152. package/dist/members/collection.js.map +1 -1
  153. package/dist/members/index.js +227 -188
  154. package/dist/members/index.js.map +1 -1
  155. package/dist/members/request.js +54 -39
  156. package/dist/members/request.js.map +1 -1
  157. package/dist/members/types.js +15 -0
  158. package/dist/members/types.js.map +1 -0
  159. package/dist/members/util.js +107 -44
  160. package/dist/members/util.js.map +1 -1
  161. package/dist/metrics/config.js +5 -14
  162. package/dist/metrics/config.js.map +1 -1
  163. package/dist/metrics/constants.js +3 -7
  164. package/dist/metrics/constants.js.map +1 -1
  165. package/dist/metrics/index.js +67 -159
  166. package/dist/metrics/index.js.map +1 -1
  167. package/dist/multistream/mediaRequestManager.js +250 -0
  168. package/dist/multistream/mediaRequestManager.js.map +1 -0
  169. package/dist/multistream/receiveSlot.js +202 -0
  170. package/dist/multistream/receiveSlot.js.map +1 -0
  171. package/dist/multistream/receiveSlotManager.js +176 -0
  172. package/dist/multistream/receiveSlotManager.js.map +1 -0
  173. package/dist/multistream/remoteMedia.js +270 -0
  174. package/dist/multistream/remoteMedia.js.map +1 -0
  175. package/dist/multistream/remoteMediaGroup.js +209 -0
  176. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  177. package/dist/multistream/remoteMediaManager.js +1137 -0
  178. package/dist/multistream/remoteMediaManager.js.map +1 -0
  179. package/dist/networkQualityMonitor/index.js +40 -59
  180. package/dist/networkQualityMonitor/index.js.map +1 -1
  181. package/dist/personal-meeting-room/index.js +21 -45
  182. package/dist/personal-meeting-room/index.js.map +1 -1
  183. package/dist/personal-meeting-room/request.js +1 -31
  184. package/dist/personal-meeting-room/request.js.map +1 -1
  185. package/dist/personal-meeting-room/util.js +0 -13
  186. package/dist/personal-meeting-room/util.js.map +1 -1
  187. package/dist/reachability/index.js +192 -191
  188. package/dist/reachability/index.js.map +1 -1
  189. package/dist/reachability/request.js +15 -23
  190. package/dist/reachability/request.js.map +1 -1
  191. package/dist/reactions/constants.js +13 -0
  192. package/dist/reactions/constants.js.map +1 -0
  193. package/dist/reactions/reactions.js +109 -0
  194. package/dist/reactions/reactions.js.map +1 -0
  195. package/dist/reactions/reactions.type.js +36 -0
  196. package/dist/reactions/reactions.type.js.map +1 -0
  197. package/dist/reconnection-manager/index.js +386 -527
  198. package/dist/reconnection-manager/index.js.map +1 -1
  199. package/dist/recording-controller/enums.js +17 -0
  200. package/dist/recording-controller/enums.js.map +1 -0
  201. package/dist/recording-controller/index.js +343 -0
  202. package/dist/recording-controller/index.js.map +1 -0
  203. package/dist/recording-controller/util.js +63 -0
  204. package/dist/recording-controller/util.js.map +1 -0
  205. package/dist/roap/index.js +84 -286
  206. package/dist/roap/index.js.map +1 -1
  207. package/dist/roap/request.js +138 -238
  208. package/dist/roap/request.js.map +1 -1
  209. package/dist/roap/turnDiscovery.js +164 -102
  210. package/dist/roap/turnDiscovery.js.map +1 -1
  211. package/dist/statsAnalyzer/global.js +1 -93
  212. package/dist/statsAnalyzer/global.js.map +1 -1
  213. package/dist/statsAnalyzer/index.js +399 -470
  214. package/dist/statsAnalyzer/index.js.map +1 -1
  215. package/dist/statsAnalyzer/mqaUtil.js +143 -87
  216. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  217. package/dist/transcription/index.js +22 -47
  218. package/dist/transcription/index.js.map +1 -1
  219. package/dist/types/annotation/annotation.types.d.ts +34 -0
  220. package/dist/types/annotation/constants.d.ts +31 -0
  221. package/dist/types/annotation/index.d.ts +124 -0
  222. package/dist/types/breakouts/breakout.d.ts +8 -0
  223. package/dist/types/breakouts/collection.d.ts +5 -0
  224. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  225. package/dist/types/breakouts/events.d.ts +2 -0
  226. package/dist/types/breakouts/index.d.ts +5 -0
  227. package/dist/types/breakouts/request.d.ts +22 -0
  228. package/dist/types/breakouts/utils.d.ts +15 -0
  229. package/dist/types/common/browser-detection.d.ts +9 -0
  230. package/dist/types/common/collection.d.ts +48 -0
  231. package/dist/types/common/config.d.ts +2 -0
  232. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  233. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  234. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  235. package/dist/types/common/errors/media.d.ts +15 -0
  236. package/dist/types/common/errors/parameter.d.ts +15 -0
  237. package/dist/types/common/errors/password-error.d.ts +15 -0
  238. package/dist/types/common/errors/permission.d.ts +14 -0
  239. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  240. package/dist/types/common/errors/reconnection.d.ts +15 -0
  241. package/dist/types/common/errors/stats.d.ts +15 -0
  242. package/dist/types/common/errors/webex-errors.d.ts +69 -0
  243. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  244. package/dist/types/common/events/events-scope.d.ts +17 -0
  245. package/dist/types/common/events/events.d.ts +12 -0
  246. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  247. package/dist/types/common/events/util.d.ts +2 -0
  248. package/dist/types/common/logs/logger-config.d.ts +2 -0
  249. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  250. package/dist/types/common/logs/request.d.ts +34 -0
  251. package/dist/types/common/queue.d.ts +32 -0
  252. package/dist/types/config.d.ts +78 -0
  253. package/dist/types/constants.d.ts +968 -0
  254. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  255. package/dist/types/controls-options-manager/enums.d.ts +13 -0
  256. package/dist/types/controls-options-manager/index.d.ts +136 -0
  257. package/dist/types/controls-options-manager/types.d.ts +37 -0
  258. package/dist/types/controls-options-manager/util.d.ts +1 -0
  259. package/dist/types/index.d.ts +7 -0
  260. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  261. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  262. package/dist/types/locus-info/fullState.d.ts +2 -0
  263. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  264. package/dist/types/locus-info/index.d.ts +315 -0
  265. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  266. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  267. package/dist/types/locus-info/parser.d.ts +212 -0
  268. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  269. package/dist/types/media/index.d.ts +34 -0
  270. package/dist/types/media/properties.d.ts +108 -0
  271. package/dist/types/media/util.d.ts +2 -0
  272. package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
  273. package/dist/types/meeting/in-meeting-actions.d.ts +129 -0
  274. package/dist/types/meeting/index.d.ts +1748 -0
  275. package/dist/types/meeting/muteState.d.ts +185 -0
  276. package/dist/types/meeting/request.d.ts +275 -0
  277. package/dist/types/meeting/request.type.d.ts +11 -0
  278. package/dist/types/meeting/state.d.ts +9 -0
  279. package/dist/types/meeting/util.d.ts +2 -0
  280. package/dist/types/meeting-info/collection.d.ts +20 -0
  281. package/dist/types/meeting-info/index.d.ts +57 -0
  282. package/dist/types/meeting-info/meeting-info-v2.d.ts +112 -0
  283. package/dist/types/meeting-info/request.d.ts +22 -0
  284. package/dist/types/meeting-info/util.d.ts +2 -0
  285. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  286. package/dist/types/meetings/collection.d.ts +31 -0
  287. package/dist/types/meetings/index.d.ts +345 -0
  288. package/dist/types/meetings/request.d.ts +27 -0
  289. package/dist/types/meetings/util.d.ts +18 -0
  290. package/dist/types/member/index.d.ts +156 -0
  291. package/dist/types/member/types.d.ts +21 -0
  292. package/dist/types/member/util.d.ts +2 -0
  293. package/dist/types/members/collection.d.ts +29 -0
  294. package/dist/types/members/index.d.ts +353 -0
  295. package/dist/types/members/request.d.ts +69 -0
  296. package/dist/types/members/types.d.ts +24 -0
  297. package/dist/types/members/util.d.ts +2 -0
  298. package/dist/types/metrics/config.d.ts +172 -0
  299. package/dist/types/metrics/constants.d.ts +54 -0
  300. package/dist/types/metrics/index.d.ts +152 -0
  301. package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
  302. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  303. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  304. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  305. package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
  306. package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
  307. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  308. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  309. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  310. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  311. package/dist/types/reachability/index.d.ts +152 -0
  312. package/dist/types/reachability/request.d.ts +37 -0
  313. package/dist/types/reactions/constants.d.ts +3 -0
  314. package/dist/types/reactions/reactions.d.ts +4 -0
  315. package/dist/types/reactions/reactions.type.d.ts +52 -0
  316. package/dist/types/reconnection-manager/index.d.ts +126 -0
  317. package/dist/types/recording-controller/enums.d.ts +7 -0
  318. package/dist/types/recording-controller/index.d.ts +193 -0
  319. package/dist/types/recording-controller/util.d.ts +13 -0
  320. package/dist/types/roap/index.d.ts +77 -0
  321. package/dist/types/roap/request.d.ts +38 -0
  322. package/dist/types/roap/turnDiscovery.d.ts +88 -0
  323. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  324. package/dist/types/statsAnalyzer/index.d.ts +200 -0
  325. package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
  326. package/dist/types/transcription/index.d.ts +64 -0
  327. package/internal-README.md +7 -6
  328. package/package.json +29 -21
  329. package/src/annotation/annotation.types.ts +41 -0
  330. package/src/annotation/constants.ts +36 -0
  331. package/src/annotation/index.ts +339 -0
  332. package/src/breakouts/README.md +219 -0
  333. package/src/breakouts/breakout.ts +141 -0
  334. package/src/breakouts/collection.ts +19 -0
  335. package/src/breakouts/edit-lock-error.ts +25 -0
  336. package/src/breakouts/events.ts +37 -0
  337. package/src/breakouts/index.ts +823 -0
  338. package/src/breakouts/request.ts +55 -0
  339. package/src/breakouts/utils.ts +57 -0
  340. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  341. package/src/common/collection.ts +9 -7
  342. package/src/common/{config.js → config.ts} +1 -1
  343. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  344. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  345. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  346. package/src/common/errors/{media.js → media.ts} +11 -7
  347. package/src/common/errors/parameter.ts +11 -7
  348. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  349. package/src/common/errors/{permission.js → permission.ts} +10 -6
  350. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  351. package/src/common/errors/{stats.js → stats.ts} +11 -7
  352. package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -25
  353. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  354. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  355. package/src/common/events/{events.js → events.ts} +5 -1
  356. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  357. package/src/common/events/{util.js → util.ts} +2 -3
  358. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  359. package/src/common/logs/logger-proxy.ts +44 -0
  360. package/src/common/logs/{request.js → request.ts} +22 -9
  361. package/src/common/queue.ts +1 -2
  362. package/src/{config.js → config.ts} +18 -12
  363. package/src/constants.ts +256 -183
  364. package/src/controls-options-manager/constants.ts +5 -0
  365. package/src/controls-options-manager/enums.ts +16 -0
  366. package/src/controls-options-manager/index.ts +278 -0
  367. package/src/controls-options-manager/types.ts +49 -0
  368. package/src/controls-options-manager/util.ts +229 -0
  369. package/src/index.ts +33 -0
  370. package/src/locus-info/controlsUtils.ts +169 -0
  371. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  372. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  373. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  374. package/src/locus-info/{index.js → index.ts} +331 -80
  375. package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
  376. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
  377. package/src/locus-info/{parser.js → parser.ts} +67 -79
  378. package/src/locus-info/{selfUtils.js → selfUtils.ts} +196 -67
  379. package/src/media/index.ts +488 -0
  380. package/src/media/{properties.js → properties.ts} +67 -54
  381. package/src/media/util.ts +16 -0
  382. package/src/mediaQualityMetrics/config.ts +384 -0
  383. package/src/meeting/in-meeting-actions.ts +123 -3
  384. package/src/meeting/{index.js → index.ts} +3334 -1775
  385. package/src/meeting/muteState.ts +526 -0
  386. package/src/meeting/{request.js → request.ts} +350 -142
  387. package/src/meeting/request.type.ts +13 -0
  388. package/src/meeting/{state.js → state.ts} +50 -35
  389. package/src/meeting/{util.js → util.ts} +126 -159
  390. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  391. package/src/meeting-info/{index.js → index.ts} +42 -36
  392. package/src/meeting-info/meeting-info-v2.ts +345 -0
  393. package/src/meeting-info/{request.js → request.ts} +14 -4
  394. package/src/meeting-info/{util.js → util.ts} +60 -51
  395. package/src/meeting-info/{utilv2.js → utilv2.ts} +76 -60
  396. package/src/meetings/{collection.js → collection.ts} +26 -3
  397. package/src/meetings/index.ts +1394 -0
  398. package/src/meetings/{request.js → request.ts} +34 -25
  399. package/src/meetings/util.ts +288 -0
  400. package/src/member/{index.js → index.ts} +124 -56
  401. package/src/member/types.ts +24 -0
  402. package/src/member/{util.js → util.ts} +105 -25
  403. package/src/members/{collection.js → collection.ts} +10 -2
  404. package/src/members/{index.js → index.ts} +359 -139
  405. package/src/members/request.ts +215 -0
  406. package/src/members/types.ts +28 -0
  407. package/src/members/{util.js → util.ts} +145 -54
  408. package/src/metrics/{config.js → config.ts} +256 -92
  409. package/src/metrics/{constants.js → constants.ts} +1 -6
  410. package/src/metrics/{index.js → index.ts} +116 -97
  411. package/src/multistream/mediaRequestManager.ts +324 -0
  412. package/src/multistream/receiveSlot.ts +184 -0
  413. package/src/multistream/receiveSlotManager.ts +166 -0
  414. package/src/multistream/remoteMedia.ts +254 -0
  415. package/src/multistream/remoteMediaGroup.ts +225 -0
  416. package/src/multistream/remoteMediaManager.ts +1075 -0
  417. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  418. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  419. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  420. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  421. package/src/reachability/{index.js → index.ts} +157 -94
  422. package/src/reachability/request.ts +46 -35
  423. package/src/reactions/constants.ts +4 -0
  424. package/src/reactions/reactions.ts +104 -0
  425. package/src/reactions/reactions.type.ts +62 -0
  426. package/src/reconnection-manager/{index.js → index.ts} +261 -163
  427. package/src/recording-controller/enums.ts +8 -0
  428. package/src/recording-controller/index.ts +315 -0
  429. package/src/recording-controller/util.ts +58 -0
  430. package/src/roap/index.ts +241 -0
  431. package/src/roap/request.ts +172 -0
  432. package/src/roap/turnDiscovery.ts +127 -53
  433. package/src/statsAnalyzer/global.ts +37 -0
  434. package/src/statsAnalyzer/index.ts +1273 -0
  435. package/src/statsAnalyzer/mqaUtil.ts +291 -0
  436. package/src/transcription/{index.js → index.ts} +46 -39
  437. package/test/integration/spec/converged-space-meetings.js +177 -0
  438. package/test/integration/spec/journey.js +666 -464
  439. package/test/integration/spec/space-meeting.js +321 -206
  440. package/test/integration/spec/transcription.js +7 -8
  441. package/test/unit/spec/annotation/index.ts +435 -0
  442. package/test/unit/spec/breakouts/breakout.ts +184 -0
  443. package/test/unit/spec/breakouts/collection.ts +15 -0
  444. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  445. package/test/unit/spec/breakouts/events.ts +77 -0
  446. package/test/unit/spec/breakouts/index.ts +1504 -0
  447. package/test/unit/spec/breakouts/request.ts +104 -0
  448. package/test/unit/spec/breakouts/utils.js +72 -0
  449. package/test/unit/spec/common/browser-detection.js +9 -28
  450. package/test/unit/spec/controls-options-manager/index.js +287 -0
  451. package/test/unit/spec/controls-options-manager/util.js +403 -0
  452. package/test/unit/spec/fixture/locus.js +92 -90
  453. package/test/unit/spec/locus-info/controlsUtils.js +177 -32
  454. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  455. package/test/unit/spec/locus-info/index.js +493 -3
  456. package/test/unit/spec/locus-info/infoUtils.js +41 -32
  457. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  458. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  459. package/test/unit/spec/locus-info/parser.js +3 -9
  460. package/test/unit/spec/locus-info/selfConstant.js +110 -103
  461. package/test/unit/spec/locus-info/selfUtils.js +236 -12
  462. package/test/unit/spec/media/index.ts +303 -0
  463. package/test/unit/spec/media/properties.ts +73 -82
  464. package/test/unit/spec/meeting/in-meeting-actions.ts +58 -3
  465. package/test/unit/spec/meeting/index.js +3127 -975
  466. package/test/unit/spec/meeting/muteState.js +375 -70
  467. package/test/unit/spec/meeting/request.js +217 -43
  468. package/test/unit/spec/meeting/utils.js +205 -163
  469. package/test/unit/spec/meeting-info/meetinginfov2.js +268 -74
  470. package/test/unit/spec/meeting-info/request.js +7 -9
  471. package/test/unit/spec/meeting-info/util.js +11 -12
  472. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  473. package/test/unit/spec/meetings/collection.js +15 -1
  474. package/test/unit/spec/meetings/index.js +1052 -333
  475. package/test/unit/spec/meetings/utils.js +163 -14
  476. package/test/unit/spec/member/index.js +24 -1
  477. package/test/unit/spec/member/util.js +359 -32
  478. package/test/unit/spec/members/index.js +547 -37
  479. package/test/unit/spec/members/request.js +76 -20
  480. package/test/unit/spec/members/utils.js +191 -4
  481. package/test/unit/spec/metrics/index.js +46 -20
  482. package/test/unit/spec/multistream/mediaRequestManager.ts +1060 -0
  483. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  484. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  485. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  486. package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
  487. package/test/unit/spec/multistream/remoteMediaManager.ts +1793 -0
  488. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  489. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  490. package/test/unit/spec/reachability/index.ts +176 -27
  491. package/test/unit/spec/reachability/request.js +66 -0
  492. package/test/unit/spec/reconnection-manager/index.js +106 -9
  493. package/test/unit/spec/recording-controller/index.js +231 -0
  494. package/test/unit/spec/recording-controller/util.js +102 -0
  495. package/test/unit/spec/roap/index.ts +78 -45
  496. package/test/unit/spec/roap/request.ts +217 -0
  497. package/test/unit/spec/roap/turnDiscovery.ts +93 -49
  498. package/test/unit/spec/stats-analyzer/index.js +118 -65
  499. package/test/utils/cmr.js +44 -42
  500. package/test/utils/constants.js +9 -0
  501. package/test/utils/integrationTestUtils.js +64 -0
  502. package/test/utils/testUtils.js +63 -99
  503. package/test/utils/webex-config.js +22 -18
  504. package/test/utils/webex-test-users.js +57 -50
  505. package/tsconfig.json +6 -0
  506. package/dist/meeting/effectsState.js +0 -327
  507. package/dist/meeting/effectsState.js.map +0 -1
  508. package/dist/peer-connection-manager/index.js +0 -794
  509. package/dist/peer-connection-manager/index.js.map +0 -1
  510. package/dist/peer-connection-manager/util.js +0 -124
  511. package/dist/peer-connection-manager/util.js.map +0 -1
  512. package/dist/roap/collection.js +0 -73
  513. package/dist/roap/collection.js.map +0 -1
  514. package/dist/roap/handler.js +0 -337
  515. package/dist/roap/handler.js.map +0 -1
  516. package/dist/roap/state.js +0 -164
  517. package/dist/roap/state.js.map +0 -1
  518. package/dist/roap/util.js +0 -102
  519. package/dist/roap/util.js.map +0 -1
  520. package/src/common/logs/logger-proxy.js +0 -33
  521. package/src/index.js +0 -15
  522. package/src/locus-info/controlsUtils.js +0 -102
  523. package/src/media/index.js +0 -593
  524. package/src/media/util.js +0 -38
  525. package/src/mediaQualityMetrics/config.js +0 -382
  526. package/src/meeting/effectsState.js +0 -205
  527. package/src/meeting/muteState.js +0 -318
  528. package/src/meeting-info/meeting-info-v2.js +0 -255
  529. package/src/meetings/index.js +0 -986
  530. package/src/meetings/util.js +0 -176
  531. package/src/members/request.js +0 -131
  532. package/src/peer-connection-manager/index.js +0 -723
  533. package/src/peer-connection-manager/util.ts +0 -117
  534. package/src/roap/collection.js +0 -63
  535. package/src/roap/handler.js +0 -252
  536. package/src/roap/index.js +0 -380
  537. package/src/roap/request.js +0 -198
  538. package/src/roap/state.js +0 -149
  539. package/src/roap/util.js +0 -93
  540. package/src/statsAnalyzer/global.js +0 -131
  541. package/src/statsAnalyzer/index.js +0 -1020
  542. package/src/statsAnalyzer/mqaUtil.js +0 -173
  543. package/test/unit/spec/meeting/effectsState.js +0 -293
  544. package/test/unit/spec/peerconnection-manager/index.js +0 -188
  545. package/test/unit/spec/peerconnection-manager/utils.js +0 -48
  546. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  547. package/test/unit/spec/roap/util.js +0 -30
  548. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -1,1020 +0,0 @@
1
- import {cloneDeep} from 'lodash';
2
-
3
- import EventsScope from '../common/events/events-scope';
4
- import {DEFAULT_GET_STATS_FILTER, CONNECTION_STATE, STATS, MQA_INTEVAL, NETWORK_TYPE, MEDIA_DEVICES, _UNKNOWN_} from '../constants';
5
- import mqaData from '../mediaQualityMetrics/config';
6
- import LoggerProxy from '../common/logs/logger-proxy';
7
-
8
- import defaultStats from './global';
9
- import {
10
- getAudioSenderMqa,
11
- getAudioReceiverMqa,
12
- getVideoSenderMqa,
13
- getVideoReceiverMqa
14
- } from './mqaUtil';
15
-
16
- export const EVENTS = {
17
- MEDIA_QUALITY: 'MEDIA_QUALITY',
18
- LOCAL_MEDIA_STARTED: 'LOCAL_MEDIA_STARTED',
19
- LOCAL_MEDIA_STOPPED: 'LOCAL_MEDIA_STOPPED',
20
- REMOTE_MEDIA_STARTED: 'REMOTE_MEDIA_STARTED',
21
- REMOTE_MEDIA_STOPPED: 'REMOTE_MEDIA_STOPPED',
22
- };
23
-
24
- /**
25
- * Stats Analyzer class that will emit events based on detected quality
26
- *
27
- * @export
28
- * @class StatsAnalyzer
29
- * @extends {EventsScope}
30
- */
31
- export class StatsAnalyzer extends EventsScope {
32
- /**
33
- * Creates a new instance of StatsAnalyzer
34
- * @constructor
35
- * @public
36
- * @param {Object} config SDK Configuration Object
37
- * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
38
- * @param {Object} statsResults Default properties for stats
39
- */
40
- constructor(config, networkQualityMonitor = {}, statsResults = defaultStats) {
41
- super();
42
- this.statsStarted = false;
43
- this.statsResults = statsResults;
44
- this.lastStatsResults = null;
45
- this.config = config;
46
- this.networkQualityMonitor = networkQualityMonitor;
47
- this.correlationId = config.correlationId;
48
- this.mqaSentCount = -1;
49
- this.lastMqaDataSent = {
50
- resolutions: {video: {send: {}, recv: {}}, audio: {send: {}, recv: {}}, share: {send: {}, recv: {}}},
51
- video: {send: {}, recv: {}},
52
- audio: {send: {}, recv: {}},
53
- share: {send: {}, recv: {}}
54
- };
55
- this.localMQEStats = {
56
- audio: {
57
- RX: {
58
- packetsLost: [],
59
- jitter: [],
60
- latency: [],
61
- bitRate: []
62
- },
63
- TX: {
64
- packetsLost: [],
65
- jitter: [],
66
- latency: [],
67
- bitRate: []
68
- }
69
- },
70
- video: {
71
- RX: {
72
- packetsLost: [],
73
- jitter: [],
74
- latency: [],
75
- bitRate: [],
76
- frameRate: [],
77
- resolutionWidth: [],
78
- resolutionHeight: [],
79
- requestedKeyFrame: [],
80
- receivedKeyFrame: []
81
- },
82
- TX: {
83
- packetsLost: [],
84
- jitter: [],
85
- latency: [],
86
- bitRate: [],
87
- frameRate: [],
88
- resolutionWidth: [],
89
- resolutionHeight: [],
90
- requestedKeyFrame: [],
91
- receivedKeyFrame: []
92
- }
93
- }
94
- };
95
- this.lastEmittedStartStopEvent = {
96
- audio: {
97
- local: undefined,
98
- remote: undefined,
99
- },
100
- video: {
101
- local: undefined,
102
- remote: undefined,
103
- },
104
- share: {
105
- local: undefined,
106
- remote: undefined,
107
- },
108
- };
109
- }
110
-
111
- populateResults(lastMqa) {
112
- // Audio
113
-
114
- this.localMQEStats.audio.RX.packetsLost.push(lastMqa.audioReceive[0].common.mediaHopByHopLost);
115
- this.localMQEStats.audio.RX.jitter.push(lastMqa.audioReceive[0].streams[0].common.rtpJitter);
116
- this.localMQEStats.audio.RX.latency.push(lastMqa.audioReceive[0].common.roundTripTime);
117
- this.localMQEStats.audio.RX.bitRate.push(lastMqa.audioReceive[0].streams[0].common.receivedBitrate);
118
-
119
- this.localMQEStats.audio.TX.packetsLost.push(lastMqa.audioTransmit[0].common.remoteLossRate);
120
- this.localMQEStats.audio.TX.jitter.push(lastMqa.audioTransmit[0].common.remoteJitter);
121
- this.localMQEStats.audio.TX.latency.push(lastMqa.audioTransmit[0].common.roundTripTime);
122
- this.localMQEStats.audio.TX.bitRate.push(lastMqa.audioTransmit[0].streams[0].common.transmittedBitrate);
123
-
124
- // Video
125
-
126
- this.localMQEStats.video.RX.packetsLost.push(lastMqa.videoReceive[0].common.mediaHopByHopLost);
127
- this.localMQEStats.video.RX.jitter.push(lastMqa.videoReceive[0].streams[0].common.rtpJitter);
128
- this.localMQEStats.video.RX.latency.push(lastMqa.videoReceive[0].streams[0].common.roundTripTime);
129
- this.localMQEStats.video.RX.bitRate.push(lastMqa.videoReceive[0].streams[0].common.receivedBitrate);
130
- this.localMQEStats.video.RX.frameRate.push(lastMqa.videoReceive[0].streams[0].common.receivedFrameRate);
131
- this.localMQEStats.video.RX.resolutionWidth.push(lastMqa.videoReceive[0].streams[0].receivedWidth);
132
- this.localMQEStats.video.RX.resolutionHeight.push(lastMqa.videoReceive[0].streams[0].receivedHeight);
133
- this.localMQEStats.video.RX.requestedKeyFrame.push();
134
- this.localMQEStats.video.RX.receivedKeyFrame.push();
135
-
136
- this.localMQEStats.video.TX.packetsLost.push(lastMqa.videoTransmit[0].common.remoteLossRate);
137
- this.localMQEStats.video.TX.jitter.push(lastMqa.videoTransmit[0].common.remoteJitter);
138
- this.localMQEStats.video.TX.latency.push(lastMqa.videoTransmit[0].common.roundTripTime);
139
- this.localMQEStats.video.TX.bitRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedBitrate);
140
- this.localMQEStats.video.TX.frameRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedFrameRate);
141
- this.localMQEStats.video.TX.resolutionWidth.push(lastMqa.videoTransmit[0].streams[0].transmittedWidth);
142
- this.localMQEStats.video.TX.resolutionHeight.push(lastMqa.videoTransmit[0].streams[0].transmittedHeight);
143
- this.localMQEStats.video.TX.requestedKeyFrame.push(lastMqa.videoTransmit[0].streams[0].requestedKeyFrames);
144
- this.localMQEStats.video.TX.receivedKeyFrame.push();
145
- }
146
-
147
-
148
- resetStatsResults() {
149
- this.statsResults.audio.send.meanRemoteJitter = [];
150
- this.statsResults.video.send.meanRemoteJitter = [];
151
- this.statsResults.share.send.meanRemoteJitter = [];
152
-
153
- this.statsResults.audio.recv.meanRtpJitter = [];
154
-
155
- // TODO: currently no values are present
156
- this.statsResults.video.recv.meanRtpJitter = [];
157
- this.statsResults.share.recv.meanRtpJitter = [];
158
-
159
- // Reset the roundTripTime
160
- this.statsResults.audio.send.meanRoundTripTime = [];
161
- this.statsResults.video.send.meanRoundTripTime = [];
162
- this.statsResults.share.send.meanRoundTripTime = [];
163
- }
164
-
165
- /**
166
- * sets mediaStatus status for analyzing metrics
167
- *
168
- * @public
169
- * @param {Object} status for the audio and video
170
- * @memberof StatsAnalyzer
171
- * @returns {void}
172
- */
173
- updateMediaStatus(status) {
174
- this.meetingMediaStatus = status;
175
- }
176
-
177
- /**
178
- * captures MQA data from peerconnection
179
- *
180
- * @public
181
- * @memberof StatsAnalyzer
182
- * @returns {void}
183
- */
184
- sendMqaData() {
185
- const audioReceiver = mqaData.intervals[0].audioReceive[0];
186
- const audioSender = mqaData.intervals[0].audioTransmit[0];
187
- const videoReceiver = mqaData.intervals[0].videoReceive[0];
188
- const videoSender = mqaData.intervals[0].videoTransmit[0];
189
- const shareSender = mqaData.intervals[0].videoTransmit[1];
190
- const shareReceiver = mqaData.intervals[0].videoReceive[1];
191
-
192
- getAudioSenderMqa({
193
- audioSender,
194
- statsResults: this.statsResults,
195
- lastMqaDataSent: this.lastMqaDataSent
196
- });
197
- getAudioReceiverMqa({
198
- audioReceiver,
199
- statsResults: this.statsResults,
200
- lastMqaDataSent: this.lastMqaDataSent
201
- });
202
-
203
- getVideoReceiverMqa({
204
- videoReceiver,
205
- statsResults: this.statsResults,
206
- lastMqaDataSent: this.lastMqaDataSent
207
- });
208
- getVideoSenderMqa({
209
- videoSender,
210
- statsResults: this.statsResults,
211
- lastMqaDataSent: this.lastMqaDataSent
212
- });
213
-
214
- // Capture mqa for share scenario
215
-
216
- getVideoSenderMqa({
217
- videoSender: shareSender,
218
- statsResults: this.statsResults,
219
- lastMqaDataSent: this.lastMqaDataSent,
220
- isShareStream: true
221
- });
222
-
223
- getVideoReceiverMqa({
224
- videoReceiver: shareReceiver,
225
- statsResults: this.statsResults,
226
- lastMqaDataSent: this.lastMqaDataSent,
227
- isShareStream: true
228
- });
229
-
230
- mqaData.intervals[0].intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];
231
-
232
- // Adding peripheral information
233
- mqaData.intervals[0].intervalMetadata.peripherals = [];
234
- mqaData.intervals[0].intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});
235
- mqaData.intervals[0].intervalMetadata.peripherals.push({information: this.peerConnection?.audioTransceiver?.sender?.track?.label || _UNKNOWN_, name: MEDIA_DEVICES.MICROPHONE});
236
- mqaData.intervals[0].intervalMetadata.peripherals.push({information: this.peerConnection?.videoTransceiver?.sender?.track?.label || _UNKNOWN_, name: MEDIA_DEVICES.CAMERA});
237
-
238
-
239
- mqaData.networkType = this.statsResults.connectionType.local.networkType;
240
-
241
- this.mqaSentCount += 1;
242
-
243
- mqaData.intervals[0].intervalNumber = this.mqaSentCount;
244
-
245
- // DO Deep copy, for some reason it takes the reference all the time rather then old value set
246
- this.lastMqaDataSent = cloneDeep(this.statsResults);
247
-
248
- this.populateResults(mqaData.intervals[0]);
249
-
250
- this.resetStatsResults();
251
-
252
- this.emit(
253
- {
254
- file: 'statsAnalyzer',
255
- function: 'sendMqaData'
256
- },
257
- EVENTS.MEDIA_QUALITY,
258
- {
259
- data: mqaData.intervals[0],
260
- networkType: mqaData.networkType
261
- }
262
- );
263
- }
264
-
265
- /**
266
- * updated the peerconnection when changed
267
- *
268
- * @private
269
- * @memberof updatePeerconnection
270
- * @param {PeerConnection} peerConnection
271
- * @returns {void}
272
- */
273
- updatePeerconnection(peerConnection) {
274
- this.peerConnection = peerConnection;
275
- }
276
-
277
- /**
278
- * Starts the stats analyzer on interval
279
- *
280
- * @public
281
- * @memberof StatsAnalyzer
282
- * @param {PeerConnection} peerConnection
283
- * @returns {Promise}
284
- */
285
- startAnalyzer(peerConnection) {
286
- if (!this.statsStarted) {
287
- this.statsStarted = true;
288
- this.peerConnection = peerConnection;
289
-
290
- return this.getStatsAndParse()
291
- .then(() => {
292
- this.statsInterval = setInterval(() => {
293
- this.getStatsAndParse();
294
- }, this.config.analyzerInterval);
295
- // Trigger initial fetch
296
- this.sendMqaData();
297
- this.mqaInterval = setInterval(() => {
298
- this.sendMqaData();
299
- }, MQA_INTEVAL);
300
- });
301
- }
302
-
303
- return Promise.resolve();
304
- }
305
-
306
- /**
307
- * Cleans up the analyzer when done
308
- *
309
- * @public
310
- * @memberof StatsAnalyzer
311
- * @returns {void}
312
- */
313
- stopAnalyzer() {
314
- const sendOneLastMqa = this.mqaInterval && this.statsInterval;
315
-
316
- if (this.statsInterval) {
317
- clearInterval(this.statsInterval);
318
- this.statsInterval = undefined;
319
- }
320
-
321
- if (this.mqaInterval) {
322
- clearInterval(this.mqaInterval);
323
- this.mqaInterval = undefined;
324
- }
325
-
326
- if (sendOneLastMqa) {
327
- return this.getStatsAndParse().then(() => {
328
- this.sendMqaData();
329
- this.peerConnection = null;
330
- });
331
- }
332
- this.peerConnection = null;
333
-
334
- return Promise.resolve();
335
- }
336
-
337
- /**
338
- * Parse a single result of get stats
339
- *
340
- * @private
341
- * @param {*} getStatsResult
342
- * @param {String} type
343
- * @param {boolean} isSender
344
- * @returns {void}
345
- * @memberof StatsAnalyzer
346
- */
347
- parseGetStatsResult(getStatsResult, type, isSender) {
348
- if (!getStatsResult) {
349
- return;
350
- }
351
-
352
- switch (getStatsResult.type) {
353
- case 'outbound-rtp':
354
- this.processOutboundRTPResult(getStatsResult, type);
355
- break;
356
- case 'inbound-rtp':
357
- this.processInboundRTPResult(getStatsResult, type);
358
- break;
359
- case 'track':
360
- this.processTrackResult(getStatsResult, type);
361
- break;
362
- case 'remote-inbound-rtp':
363
- case 'remote-outbound-rtp':
364
- this.compareSentAndReceived(getStatsResult, type, isSender);
365
- break;
366
- case 'remotecandidate':
367
- case 'remote-candidate':
368
- this.parseCandidate(getStatsResult, type, isSender, true);
369
- break;
370
- case 'local-candidate':
371
- this.parseCandidate(getStatsResult, type, isSender, false);
372
- break;
373
- case 'media-source':
374
- this.parseAudioSource(getStatsResult, type);
375
- break;
376
- default:
377
- break;
378
- }
379
- }
380
-
381
- /**
382
- * Filters the get stats results for types
383
- * @private
384
- * @param {Array} getStatsResults
385
- * @param {String} type
386
- * @param {boolean} isSender
387
- * @returns {void}
388
- */
389
- filterAndParseGetStatsResults(getStatsResults, type, isSender) {
390
- const {types} = DEFAULT_GET_STATS_FILTER;
391
-
392
- getStatsResults.forEach((result) => {
393
- if (types.includes(result.type)) {
394
- this.parseGetStatsResult(result, type, isSender);
395
- }
396
- });
397
- }
398
-
399
- /**
400
- * parse the audio
401
- * @param {String} result
402
- * @param {boolean} type
403
- * @returns {void}
404
- */
405
- parseAudioSource(result, type) {
406
- if (!result) {
407
- return;
408
- }
409
-
410
- if (type === STATS.AUDIO_CORRELATE) {
411
- this.statsResults[type].send.audioLevel = result.audioLevel;
412
- this.statsResults[type].send.totalAudioEnergy = result.totalAudioEnergy;
413
- }
414
- }
415
-
416
- /**
417
- * emits started/stopped events for local/remote media by checking
418
- * if given values are increasing or not. The previousValue, currentValue
419
- * params can be any numerical value like number of receive packets or
420
- * decoded frames, etc.
421
- *
422
- * @private
423
- * @param {string} mediaType
424
- * @param {number} previousValue - value to compare
425
- * @param {number} currentValue - value to compare (must be same type of value as previousValue)
426
- * @param {boolean} isLocal - true if stats are for local media being sent out, false for remote media being received
427
- * @memberof StatsAnalyzer
428
- * @returns {void}
429
- */
430
- emitStartStopEvents = (mediaType, previousValue, currentValue, isLocal) => {
431
- if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {
432
- throw new Error(`Unsupported mediaType: ${mediaType}`);
433
- }
434
-
435
- // eslint-disable-next-line no-param-reassign
436
- if (previousValue === undefined) previousValue = 0;
437
- // eslint-disable-next-line no-param-reassign
438
- if (currentValue === undefined) currentValue = 0;
439
-
440
- const lastEmittedEvent = isLocal ? this.lastEmittedStartStopEvent[mediaType].local : this.lastEmittedStartStopEvent[mediaType].remote;
441
-
442
- let newEvent;
443
-
444
- if ((currentValue - previousValue) > 0) {
445
- newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STARTED : EVENTS.REMOTE_MEDIA_STARTED;
446
- }
447
- else if ((currentValue === previousValue) && currentValue > 0) {
448
- newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STOPPED : EVENTS.REMOTE_MEDIA_STOPPED;
449
- }
450
-
451
- if (newEvent && lastEmittedEvent !== newEvent) {
452
- if (isLocal) {
453
- this.lastEmittedStartStopEvent[mediaType].local = newEvent;
454
- }
455
- else {
456
- this.lastEmittedStartStopEvent[mediaType].remote = newEvent;
457
- }
458
- this.emit(
459
- {
460
- file: 'statsAnalyzer/index',
461
- function: 'compareLastStatsResult'
462
- },
463
- newEvent,
464
- {
465
- type: mediaType
466
- }
467
- );
468
- }
469
- };
470
-
471
- /**
472
- * compares current and previous stats to check if packets are not sent
473
- *
474
- * @private
475
- * @memberof StatsAnalyzer
476
- * @returns {void}
477
- */
478
- compareLastStatsResult() {
479
- if (this.lastStatsResults !== null && this.meetingMediaStatus) {
480
- // compare audio stats sent
481
- let mediaType = STATS.AUDIO_CORRELATE;
482
- let currentStats = null;
483
- let previousStats = null;
484
-
485
- if (this.meetingMediaStatus.expected.sendAudio) {
486
- currentStats = this.statsResults[mediaType].send;
487
- previousStats = this.lastStatsResults[mediaType].send;
488
-
489
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
490
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);
491
- }
492
- else {
493
- if (currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {
494
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Energy present`);
495
- }
496
-
497
- if (currentStats.audioLevel === 0) {
498
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} level is 0 for the user`);
499
- }
500
- }
501
-
502
- this.emitStartStopEvents(mediaType, previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);
503
- }
504
-
505
- if (this.meetingMediaStatus.expected.receiveAudio) {
506
- // compare audio stats received
507
- currentStats = this.statsResults[mediaType].recv;
508
- previousStats = this.lastStatsResults[mediaType].recv;
509
-
510
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {
511
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);
512
- }
513
- else if (currentStats.totalSamplesReceived === previousStats.totalSamplesReceived ||
514
- currentStats.totalSamplesReceived === 0) {
515
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} samples received`);
516
- }
517
-
518
- this.emitStartStopEvents(mediaType, previousStats.totalPacketsReceived, currentStats.totalPacketsReceived, false);
519
- }
520
-
521
- mediaType = STATS.VIDEO_CORRELATE;
522
- if (this.meetingMediaStatus.expected.sendVideo) {
523
- // compare video stats sent
524
- currentStats = this.statsResults[mediaType].send;
525
- previousStats = this.lastStatsResults[mediaType].send;
526
-
527
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
528
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);
529
- }
530
- else {
531
- if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {
532
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames Encoded`);
533
- }
534
-
535
- if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {
536
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames sent`);
537
- }
538
- }
539
-
540
- this.emitStartStopEvents(
541
- mediaType,
542
- previousStats.framesSent,
543
- currentStats.framesSent,
544
- true
545
- );
546
- }
547
-
548
-
549
- if (this.meetingMediaStatus.expected.receiveVideo) {
550
- // compare video stats reveived
551
-
552
- currentStats = this.statsResults[mediaType].recv;
553
- previousStats = this.lastStatsResults[mediaType].recv;
554
-
555
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {
556
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);
557
- }
558
- else {
559
- if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {
560
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`);
561
- }
562
-
563
- if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {
564
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`);
565
- }
566
-
567
- if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {
568
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`);
569
- }
570
- }
571
-
572
- this.emitStartStopEvents(
573
- mediaType,
574
- previousStats.framesDecoded,
575
- currentStats.framesDecoded,
576
- false
577
- );
578
- }
579
-
580
- mediaType = STATS.SHARE_CORRELATE;
581
- if (this.meetingMediaStatus.expected.sendShare) {
582
- // compare share stats sent
583
-
584
- currentStats = this.statsResults[mediaType].send;
585
- previousStats = this.lastStatsResults[mediaType].send;
586
-
587
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
588
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`);
589
- }
590
- else {
591
- if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {
592
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames getting encoded`);
593
- }
594
-
595
- if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {
596
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames sent`);
597
- }
598
- }
599
-
600
- // TODO:need to check receive share value
601
- // compare share stats reveived
602
- currentStats = this.statsResults[mediaType].recv;
603
- previousStats = this.lastStatsResults[mediaType].recv;
604
-
605
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsSent === 0) {
606
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`);
607
- }
608
- else {
609
- if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {
610
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`);
611
- }
612
-
613
- if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {
614
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`);
615
- }
616
-
617
- if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {
618
- LoggerProxy.logger.info(`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`);
619
- }
620
- }
621
-
622
- // we are not calling emitStartStopEvents() for sending or receiving share because sharing is often started and stopped
623
- // in meetings and this.meetingMediaStatus.expected values can be out of sync with the actual packet flow
624
- // so we would send "sharing stopped" events incorrectly
625
- }
626
- }
627
- }
628
-
629
- /**
630
- * Does a `getStats` on all the transceivers and parses the results
631
- *
632
- * @private
633
- * @memberof StatsAnalyzer
634
- * @returns {Promise}
635
- */
636
- getStatsAndParse() {
637
- if (!this.peerConnection) {
638
- return Promise.resolve();
639
- }
640
-
641
- if (this.peerConnection && this.peerConnection.connectionState === CONNECTION_STATE.FAILED) {
642
- LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> PeerConnection is in failed state');
643
-
644
- return Promise.resolve();
645
- }
646
-
647
- LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Collecting Stats');
648
-
649
- return Promise.all([
650
- this.peerConnection.videoTransceiver.sender.getStats().then((res) => {
651
- this.filterAndParseGetStatsResults(res, STATS.VIDEO_CORRELATE, true);
652
- }),
653
-
654
- this.peerConnection.videoTransceiver.receiver.getStats().then((res) => {
655
- this.filterAndParseGetStatsResults(res, STATS.VIDEO_CORRELATE, false);
656
- }),
657
-
658
- this.peerConnection.audioTransceiver.sender.getStats().then((res) => {
659
- this.filterAndParseGetStatsResults(res, STATS.AUDIO_CORRELATE, true);
660
- }),
661
-
662
- this.peerConnection.audioTransceiver.receiver.getStats().then((res) => {
663
- this.filterAndParseGetStatsResults(res, STATS.AUDIO_CORRELATE, false);
664
- }),
665
-
666
- // TODO: add checks for screen share
667
- this.peerConnection.shareTransceiver.sender.getStats().then((res) => {
668
- this.filterAndParseGetStatsResults(res, STATS.SHARE_CORRELATE, true);
669
- }),
670
-
671
- this.peerConnection.shareTransceiver.receiver.getStats().then((res) => {
672
- this.filterAndParseGetStatsResults(res, STATS.SHARE_CORRELATE, false);
673
- }),
674
-
675
- ]).then(() => {
676
- this.statsResults[STATS.AUDIO_CORRELATE].direction = this.peerConnection.audioTransceiver.currentDirection;
677
- this.statsResults[STATS.VIDEO_CORRELATE].direction = this.peerConnection.videoTransceiver.currentDirection;
678
- this.statsResults[STATS.SHARE_CORRELATE].direction = this.peerConnection.shareTransceiver.currentDirection;
679
-
680
- // Process Stats results every 5 seconds
681
- this.compareLastStatsResult();
682
-
683
- // Save the last results to compare with the current
684
- this.lastStatsResults = JSON.parse(JSON.stringify(this.statsResults));
685
-
686
- LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats');
687
- });
688
- }
689
-
690
- /**
691
- * Processes OutboundRTP stats result and stores
692
- * @private
693
- * @param {*} result
694
- * @param {*} type
695
- * @returns {void}
696
- */
697
- processOutboundRTPResult(result, type) {
698
- const mediaType = type || STATS.AUDIO_CORRELATE;
699
- const sendrecvType = STATS.SEND_DIRECTION;
700
-
701
- if (result.bytesSent) {
702
- let kilobytes = 0;
703
-
704
- if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
705
- this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
706
- }
707
- if (!this.statsResults.internal[mediaType][sendrecvType].framesEncoded) {
708
- this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
709
- }
710
- if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {
711
- this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded;
712
- }
713
-
714
- const bytes = result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;
715
-
716
- this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
717
-
718
- kilobytes = bytes / 1024;
719
-
720
- this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
721
- this.statsResults[mediaType].bytesSent = kilobytes;
722
-
723
- this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;
724
- this.statsResults[mediaType][sendrecvType].keyFramesEncoded = result.keyFramesEncoded - this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;
725
- this.statsResults.internal[mediaType].outboundRtpId = result.id;
726
-
727
- if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {
728
- this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
729
- }
730
-
731
- this.statsResults[mediaType][sendrecvType].packetsSent = result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;
732
- this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
733
-
734
- // Data saved to send MQA metrics
735
-
736
- this.statsResults[mediaType][sendrecvType].totalKeyFramesEncoded = result.keyFramesEncoded;
737
- this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;
738
- this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;
739
- this.statsResults[mediaType][sendrecvType].totalPacketsSent = result.packetsSent;
740
- this.statsResults[mediaType][sendrecvType].totalFirCount = result.firCount;
741
- this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;
742
- this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
743
- this.statsResults[mediaType][sendrecvType].encoderImplementation = result.encoderImplementation;
744
- this.statsResults[mediaType][sendrecvType].qualityLimitationReason = result.qualityLimitationReason;
745
- this.statsResults[mediaType][sendrecvType].qualityLimitationResolutionChanges = result.qualityLimitationResolutionChanges;
746
- this.statsResults[mediaType][sendrecvType].retransmittedPacketsSent = result.retransmittedPacketsSent;
747
- this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;
748
- this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;
749
- this.statsResults[mediaType][sendrecvType].retransmittedBytesSent = result.retransmittedBytesSent;
750
- }
751
- }
752
-
753
-
754
- /**
755
- * Processes InboundRTP stats result and stores
756
- * @private
757
- * @param {*} result
758
- * @param {*} type
759
- * @returns {void}
760
- */
761
- processInboundRTPResult(result, type) {
762
- const mediaType = type || STATS.AUDIO_CORRELATE;
763
- const sendrecvType = STATS.RECEIVE_DIRECTION;
764
-
765
- if (result.bytesReceived) {
766
- let kilobytes = 0;
767
-
768
- if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
769
- this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
770
- }
771
-
772
- if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {
773
- this.statsResults.internal[mediaType][sendrecvType].pliCount = result.pliCount;
774
- }
775
-
776
- if (!this.statsResults.internal[mediaType][sendrecvType].packetsLost) {
777
- this.statsResults.internal[mediaType][sendrecvType].packetsLost = result.packetsLost;
778
- }
779
-
780
- if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {
781
- this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
782
- }
783
-
784
- if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {
785
- this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;
786
- }
787
-
788
- const bytes = result.bytesReceived - (this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived);
789
-
790
- this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
791
-
792
- kilobytes = bytes / 1024;
793
- this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
794
- this.statsResults[mediaType].bytesReceived = kilobytes.toFixed(1);
795
-
796
- this.statsResults[mediaType][sendrecvType].pliCount = result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;
797
- this.statsResults[mediaType][sendrecvType].currentPacketsLost = result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;
798
- if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {
799
- this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;
800
- }
801
-
802
- this.statsResults[mediaType][sendrecvType].packetsReceived = result.packetsReceived - this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;
803
- this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
804
-
805
- if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
806
- LoggerProxy.logger.info(`StatsAnalyzer:index#processInboundRTPResult --> No packets received for ${mediaType} `, this.statsResults[mediaType][sendrecvType].packetsReceived);
807
- }
808
-
809
- // Check the over all packet Lost ratio
810
- this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0 ? this.statsResults[mediaType][sendrecvType].currentPacketsLost / (this.statsResults[mediaType][sendrecvType].packetsReceived + this.statsResults[mediaType][sendrecvType].currentPacketsLost) : 0;
811
- if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
812
- LoggerProxy.logger.info('StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ', this.statsResults[mediaType][sendrecvType].currentPacketLossRatio);
813
- }
814
-
815
- // TODO: check the packet loss value is negative values here
816
-
817
- if (result.packetsLost) {
818
- this.statsResults[mediaType][sendrecvType].totalPacketsLost = result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;
819
- }
820
- else {
821
- this.statsResults[mediaType][sendrecvType].totalPacketsLost = 0;
822
- }
823
-
824
- this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp = result.lastPacketReceivedTimestamp;
825
-
826
- // From Thin
827
- this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;
828
- this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;
829
- this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
830
- this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;
831
-
832
- this.statsResults[mediaType][sendrecvType].decoderImplementation = result.decoderImplementation;
833
- this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
834
-
835
-
836
- this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;
837
- this.statsResults[mediaType][sendrecvType].fecPacketsReceived = result.fecPacketsReceived;
838
- this.statsResults[mediaType][sendrecvType].totalBytesReceived = result.bytesReceived;
839
- this.statsResults[mediaType][sendrecvType].headerBytesReceived = result.headerBytesReceived;
840
-
841
- this.statsResults[mediaType][sendrecvType].meanRtpJitter.push(result.jitter);
842
-
843
- // Audio stats
844
-
845
- this.statsResults[mediaType][sendrecvType].audioLevel = result.audioLevel;
846
- this.statsResults[mediaType][sendrecvType].totalAudioEnergy = result.totalAudioEnergy;
847
- this.statsResults[mediaType][sendrecvType].totalSamplesReceived = result.totalSamplesReceived || 0;
848
- this.statsResults[mediaType][sendrecvType].totalSamplesDecoded = result.totalSamplesDecoded || 0;
849
- this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;
850
- }
851
- }
852
-
853
- /**
854
- * Processes remote and local candidate result and stores
855
- * @private
856
- * @param {*} result
857
- * @param {*} type
858
- * @param {boolean} isSender
859
- * @param {boolean} isRemote
860
- *
861
- * @returns {void}
862
- */
863
- parseCandidate = (result, type, isSender, isRemote) => {
864
- if (!result || !result.id) {
865
- return;
866
- }
867
- const RemoteCandidateType = {};
868
- const RemoteTransport = {};
869
- const RemoteIpAddress = {};
870
- const RemoteNetworkType = {};
871
-
872
- if (!result.id) return;
873
-
874
- const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
875
- const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
876
-
877
- if (!RemoteCandidateType[result.id]) {
878
- RemoteCandidateType[result.id] = [];
879
- }
880
-
881
- if (!RemoteTransport[result.id]) {
882
- RemoteTransport[result.id] = [];
883
- }
884
-
885
- if (!RemoteIpAddress[result.id]) {
886
- RemoteIpAddress[result.id] = [];
887
- }
888
- if (!RemoteNetworkType[result.id]) {
889
- RemoteNetworkType[result.id] = [];
890
- }
891
-
892
- if (result.candidateType && RemoteCandidateType[result.id].indexOf(result.candidateType) === -1) {
893
- RemoteCandidateType[result.id].push(result.candidateType);
894
- }
895
-
896
- if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {
897
- RemoteTransport[result.id].push(result.protocol.toUpperCase());
898
- }
899
-
900
- if (result.ip && RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1) {
901
- RemoteIpAddress[result.id].push(`${result.ip}`); // TODO: Add ports
902
- }
903
-
904
- if (result.networkType && RemoteNetworkType[result.id].indexOf(result.networkType) === -1) {
905
- RemoteNetworkType[result.id].push(result.networkType);
906
- }
907
-
908
- this.statsResults.internal.candidates[result.id] = {
909
- candidateType: RemoteCandidateType[result.id],
910
- ipAddress: RemoteIpAddress[result.id],
911
- portNumber: result.port,
912
- networkType: RemoteNetworkType[result.id],
913
- priority: result.priority,
914
- transport: RemoteTransport[result.id],
915
- timestamp: result.time,
916
- id: result.id,
917
- type: result.type
918
- };
919
-
920
- this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];
921
- this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];
922
-
923
- this.statsResults.connectionType[ipType].networkType = RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : RemoteNetworkType[result.id][0];
924
- this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
925
-
926
- this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
927
- };
928
-
929
- /**
930
- * Process Track results
931
- *
932
- * @private
933
- * @param {*} result
934
- * @param {*} mediaType
935
- * @returns {void}
936
- * @memberof StatsAnalyzer
937
- */
938
- processTrackResult(result, mediaType) {
939
- if (!result || result.type !== 'track') {
940
- return;
941
- }
942
- if (result.type !== 'track') return;
943
-
944
- const sendrecvType = result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
945
-
946
- if (result.frameWidth && result.frameHeight) {
947
- this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
948
- this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
949
- this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
950
- this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
951
- }
952
-
953
- if (sendrecvType === STATS.RECEIVE_DIRECTION) {
954
- this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
955
- this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
956
- this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;
957
- }
958
-
959
-
960
- if (result.trackIdentifier && mediaType !== STATS.AUDIO_CORRELATE) {
961
- this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier = result.trackIdentifier;
962
-
963
- const jitterBufferDelay = result && result.jitterBufferDelay;
964
- const jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;
965
-
966
- this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay = jitterBufferEmittedCount && (+jitterBufferDelay / +jitterBufferEmittedCount);
967
-
968
- // Used to calculate the jitter
969
- this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay = result.jitterBufferDelay;
970
- this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount = result.jitterBufferEmittedCount;
971
- }
972
- }
973
-
974
- /**
975
- *
976
- * @private
977
- * @param {*} result
978
- * @param {*} type
979
- * @returns {void}
980
- * @memberof StatsAnalyzer
981
- */
982
- compareSentAndReceived(result, type) {
983
- if (!type) {
984
- return;
985
- }
986
-
987
- const mediaType = type;
988
-
989
- if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) { this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost; }
990
-
991
- const currentPacketLoss = result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;
992
-
993
- this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
994
- this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;
995
- this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
996
-
997
- this.statsResults[mediaType].send.meanRemoteJitter.push(result.jitter);
998
- this.statsResults[mediaType].send.meanRoundTripTime.push(result.roundTripTime);
999
-
1000
- this.statsResults[mediaType].send.timestamp = result.timestamp;
1001
- this.statsResults[mediaType].send.ssrc = result.ssrc;
1002
- this.statsResults[mediaType].send.reportsReceived = result.reportsReceived;
1003
-
1004
- // Total packloss ratio on this video section of the call
1005
- this.statsResults[mediaType].send.overAllPacketLossRatio = this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0 ? this.statsResults[mediaType].send.totalPacketsLostOnReceiver / this.statsResults[mediaType].send.totalPacketsSent : 0;
1006
- this.statsResults[mediaType].send.currentPacketLossRatio = this.statsResults[mediaType].send.packetsLostOnReceiver > 0 ? this.statsResults[mediaType].send.packetsLostOnReceiver * 100 / (this.statsResults[mediaType].send.packetsSent + this.statsResults[mediaType].send.packetsLostOnReceiver) : 0;
1007
-
1008
- if (this.statsResults[mediaType].send.maxPacketLossRatio < this.statsResults[mediaType].send.currentPacketLossRatio) {
1009
- this.statsResults[mediaType].send.maxPacketLossRatio = this.statsResults[mediaType].send.currentPacketLossRatio;
1010
- }
1011
-
1012
- if (result.type === 'remote-inbound-rtp') {
1013
- this.networkQualityMonitor.determineUplinkNetworkQuality({
1014
- mediaType,
1015
- remoteRtpResults: result,
1016
- statsAnalyzerCurrentStats: this.statsResults
1017
- });
1018
- }
1019
- }
1020
- }