@webex/plugin-meetings 2.60.1-next.9 → 2.60.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (539) hide show
  1. package/README.md +8 -58
  2. package/dist/common/browser-detection.js +3 -2
  3. package/dist/common/browser-detection.js.map +1 -1
  4. package/dist/common/collection.js +4 -3
  5. package/dist/common/collection.js.map +1 -1
  6. package/dist/common/config.js +2 -1
  7. package/dist/common/config.js.map +1 -1
  8. package/dist/common/errors/captcha-error.js +2 -1
  9. package/dist/common/errors/captcha-error.js.map +1 -1
  10. package/dist/common/errors/intent-to-join.js +2 -1
  11. package/dist/common/errors/intent-to-join.js.map +1 -1
  12. package/dist/common/errors/join-meeting.js +2 -1
  13. package/dist/common/errors/join-meeting.js.map +1 -1
  14. package/dist/common/errors/media.js +2 -1
  15. package/dist/common/errors/media.js.map +1 -1
  16. package/dist/common/errors/parameter.js +4 -3
  17. package/dist/common/errors/parameter.js.map +1 -1
  18. package/dist/common/errors/password-error.js +2 -1
  19. package/dist/common/errors/password-error.js.map +1 -1
  20. package/dist/common/errors/permission.js +2 -1
  21. package/dist/common/errors/permission.js.map +1 -1
  22. package/dist/common/errors/{reclaim-host-role-errors.js → reclaim-host-role-error.js} +11 -7
  23. package/dist/common/errors/reclaim-host-role-error.js.map +1 -0
  24. package/dist/common/errors/reconnection-in-progress.js +2 -1
  25. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  26. package/dist/common/errors/reconnection.js +2 -1
  27. package/dist/common/errors/reconnection.js.map +1 -1
  28. package/dist/common/errors/stats.js +2 -1
  29. package/dist/common/errors/stats.js.map +1 -1
  30. package/dist/common/errors/webex-errors.d.ts +8 -20
  31. package/dist/common/errors/webex-errors.js +28 -48
  32. package/dist/common/errors/webex-errors.js.map +1 -1
  33. package/dist/common/errors/webex-meetings-error.js +2 -1
  34. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  35. package/dist/common/events/events-scope.js +2 -1
  36. package/dist/common/events/events-scope.js.map +1 -1
  37. package/dist/common/events/events.js +2 -1
  38. package/dist/common/events/events.js.map +1 -1
  39. package/dist/common/events/trigger-proxy.js +2 -1
  40. package/dist/common/events/trigger-proxy.js.map +1 -1
  41. package/dist/common/events/util.js +2 -1
  42. package/dist/common/events/util.js.map +1 -1
  43. package/dist/common/logs/logger-config.js +2 -1
  44. package/dist/common/logs/logger-config.js.map +1 -1
  45. package/dist/common/logs/logger-proxy.js +3 -2
  46. package/dist/common/logs/logger-proxy.js.map +1 -1
  47. package/dist/common/logs/request.d.ts +1 -3
  48. package/dist/common/logs/request.js +5 -8
  49. package/dist/common/logs/request.js.map +1 -1
  50. package/dist/common/queue.d.ts +7 -9
  51. package/dist/common/queue.js +9 -22
  52. package/dist/common/queue.js.map +1 -1
  53. package/dist/config.d.ts +7 -6
  54. package/dist/config.js +10 -8
  55. package/dist/config.js.map +1 -1
  56. package/dist/constants.d.ts +100 -234
  57. package/dist/constants.js +444 -433
  58. package/dist/constants.js.map +1 -1
  59. package/dist/controls-options-manager/constants.js +6 -3
  60. package/dist/controls-options-manager/constants.js.map +1 -1
  61. package/dist/controls-options-manager/enums.d.ts +1 -11
  62. package/dist/controls-options-manager/enums.js +6 -15
  63. package/dist/controls-options-manager/enums.js.map +1 -1
  64. package/dist/controls-options-manager/index.d.ts +1 -17
  65. package/dist/controls-options-manager/index.js +38 -127
  66. package/dist/controls-options-manager/index.js.map +1 -1
  67. package/dist/controls-options-manager/util.d.ts +7 -1
  68. package/dist/controls-options-manager/util.js +19 -309
  69. package/dist/controls-options-manager/util.js.map +1 -1
  70. package/dist/index.d.ts +3 -6
  71. package/dist/index.js +5 -121
  72. package/dist/index.js.map +1 -1
  73. package/dist/locus-info/controlsUtils.js +11 -100
  74. package/dist/locus-info/controlsUtils.js.map +1 -1
  75. package/dist/locus-info/embeddedAppsUtils.js +4 -3
  76. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  77. package/dist/locus-info/fullState.js +2 -1
  78. package/dist/locus-info/fullState.js.map +1 -1
  79. package/dist/locus-info/hostUtils.js +2 -1
  80. package/dist/locus-info/hostUtils.js.map +1 -1
  81. package/dist/locus-info/index.d.ts +4 -57
  82. package/dist/locus-info/index.js +84 -425
  83. package/dist/locus-info/index.js.map +1 -1
  84. package/dist/locus-info/infoUtils.js +5 -13
  85. package/dist/locus-info/infoUtils.js.map +1 -1
  86. package/dist/locus-info/mediaSharesUtils.js +3 -58
  87. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  88. package/dist/locus-info/parser.d.ts +6 -66
  89. package/dist/locus-info/parser.js +80 -253
  90. package/dist/locus-info/parser.js.map +1 -1
  91. package/dist/locus-info/selfUtils.js +13 -97
  92. package/dist/locus-info/selfUtils.js.map +1 -1
  93. package/dist/media/index.d.ts +0 -2
  94. package/dist/media/index.js +319 -107
  95. package/dist/media/index.js.map +1 -1
  96. package/dist/media/properties.d.ts +53 -38
  97. package/dist/media/properties.js +153 -96
  98. package/dist/media/properties.js.map +1 -1
  99. package/dist/media/util.js +22 -1
  100. package/dist/media/util.js.map +1 -1
  101. package/dist/mediaQualityMetrics/config.d.ts +230 -234
  102. package/dist/mediaQualityMetrics/config.js +498 -302
  103. package/dist/mediaQualityMetrics/config.js.map +1 -1
  104. package/dist/meeting/effectsState.d.ts +42 -0
  105. package/dist/meeting/effectsState.js +260 -0
  106. package/dist/meeting/effectsState.js.map +1 -0
  107. package/dist/meeting/in-meeting-actions.d.ts +0 -88
  108. package/dist/meeting/in-meeting-actions.js +3 -94
  109. package/dist/meeting/in-meeting-actions.js.map +1 -1
  110. package/dist/meeting/index.d.ts +520 -705
  111. package/dist/meeting/index.js +3083 -5041
  112. package/dist/meeting/index.js.map +1 -1
  113. package/dist/meeting/muteState.d.ts +25 -93
  114. package/dist/meeting/muteState.js +133 -224
  115. package/dist/meeting/muteState.js.map +1 -1
  116. package/dist/meeting/request.d.ts +47 -82
  117. package/dist/meeting/request.js +199 -304
  118. package/dist/meeting/request.js.map +1 -1
  119. package/dist/meeting/state.js +2 -1
  120. package/dist/meeting/state.js.map +1 -1
  121. package/dist/meeting/util.d.ts +1 -118
  122. package/dist/meeting/util.js +435 -676
  123. package/dist/meeting/util.js.map +1 -1
  124. package/dist/meeting-info/collection.js +4 -3
  125. package/dist/meeting-info/collection.js.map +1 -1
  126. package/dist/meeting-info/index.d.ts +1 -13
  127. package/dist/meeting-info/index.js +7 -74
  128. package/dist/meeting-info/index.js.map +1 -1
  129. package/dist/meeting-info/meeting-info-v2.d.ts +1 -31
  130. package/dist/meeting-info/meeting-info-v2.js +63 -200
  131. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  132. package/dist/meeting-info/request.js +2 -1
  133. package/dist/meeting-info/request.js.map +1 -1
  134. package/dist/meeting-info/util.js +3 -2
  135. package/dist/meeting-info/util.js.map +1 -1
  136. package/dist/meeting-info/utilv2.js +41 -39
  137. package/dist/meeting-info/utilv2.js.map +1 -1
  138. package/dist/meetings/collection.d.ts +0 -17
  139. package/dist/meetings/collection.js +4 -42
  140. package/dist/meetings/collection.js.map +1 -1
  141. package/dist/meetings/index.d.ts +20 -114
  142. package/dist/meetings/index.js +133 -540
  143. package/dist/meetings/index.js.map +1 -1
  144. package/dist/meetings/request.js +3 -4
  145. package/dist/meetings/request.js.map +1 -1
  146. package/dist/meetings/util.js +6 -107
  147. package/dist/meetings/util.js.map +1 -1
  148. package/dist/member/index.d.ts +1 -13
  149. package/dist/member/index.js +2 -45
  150. package/dist/member/index.js.map +1 -1
  151. package/dist/member/member.types.js +4 -3
  152. package/dist/member/member.types.js.map +1 -1
  153. package/dist/member/util.js +29 -120
  154. package/dist/member/util.js.map +1 -1
  155. package/dist/members/collection.d.ts +0 -5
  156. package/dist/members/collection.js +2 -11
  157. package/dist/members/collection.js.map +1 -1
  158. package/dist/members/index.d.ts +11 -56
  159. package/dist/members/index.js +47 -174
  160. package/dist/members/index.js.map +1 -1
  161. package/dist/members/request.d.ts +11 -67
  162. package/dist/members/request.js +54 -102
  163. package/dist/members/request.js.map +1 -1
  164. package/dist/members/types.js +4 -3
  165. package/dist/members/types.js.map +1 -1
  166. package/dist/members/util.d.ts +1 -214
  167. package/dist/members/util.js +284 -327
  168. package/dist/members/util.js.map +1 -1
  169. package/dist/metrics/config.d.ts +169 -0
  170. package/dist/metrics/config.js +289 -0
  171. package/dist/metrics/config.js.map +1 -0
  172. package/dist/metrics/constants.d.ts +6 -15
  173. package/dist/metrics/constants.js +9 -17
  174. package/dist/metrics/constants.js.map +1 -1
  175. package/dist/metrics/index.d.ts +111 -4
  176. package/dist/metrics/index.js +452 -4
  177. package/dist/metrics/index.js.map +1 -1
  178. package/dist/networkQualityMonitor/index.js +4 -5
  179. package/dist/networkQualityMonitor/index.js.map +1 -1
  180. package/dist/peer-connection-manager/index.d.ts +6 -0
  181. package/dist/peer-connection-manager/index.js +671 -0
  182. package/dist/peer-connection-manager/index.js.map +1 -0
  183. package/dist/peer-connection-manager/util.d.ts +6 -0
  184. package/dist/peer-connection-manager/util.js +110 -0
  185. package/dist/peer-connection-manager/util.js.map +1 -0
  186. package/dist/personal-meeting-room/index.js +3 -2
  187. package/dist/personal-meeting-room/index.js.map +1 -1
  188. package/dist/personal-meeting-room/request.js +3 -2
  189. package/dist/personal-meeting-room/request.js.map +1 -1
  190. package/dist/personal-meeting-room/util.js +2 -1
  191. package/dist/personal-meeting-room/util.js.map +1 -1
  192. package/dist/reachability/index.d.ts +95 -61
  193. package/dist/reachability/index.js +392 -304
  194. package/dist/reachability/index.js.map +1 -1
  195. package/dist/reachability/request.d.ts +3 -7
  196. package/dist/reachability/request.js +10 -18
  197. package/dist/reachability/request.js.map +1 -1
  198. package/dist/reactions/reactions.d.ts +2 -2
  199. package/dist/reactions/reactions.js +6 -4
  200. package/dist/reactions/reactions.js.map +1 -1
  201. package/dist/reactions/reactions.type.d.ts +3 -23
  202. package/dist/reactions/reactions.type.js +23 -21
  203. package/dist/reactions/reactions.type.js.map +1 -1
  204. package/dist/reconnection-manager/index.d.ts +8 -32
  205. package/dist/reconnection-manager/index.js +232 -285
  206. package/dist/reconnection-manager/index.js.map +1 -1
  207. package/dist/recording-controller/enums.js +5 -4
  208. package/dist/recording-controller/enums.js.map +1 -1
  209. package/dist/recording-controller/index.d.ts +1 -15
  210. package/dist/recording-controller/index.js +46 -57
  211. package/dist/recording-controller/index.js.map +1 -1
  212. package/dist/recording-controller/util.d.ts +4 -5
  213. package/dist/recording-controller/util.js +10 -10
  214. package/dist/recording-controller/util.js.map +1 -1
  215. package/dist/roap/collection.d.ts +10 -0
  216. package/dist/roap/collection.js +63 -0
  217. package/dist/roap/collection.js.map +1 -0
  218. package/dist/roap/handler.d.ts +47 -0
  219. package/dist/roap/handler.js +279 -0
  220. package/dist/roap/handler.js.map +1 -0
  221. package/dist/roap/index.d.ts +47 -9
  222. package/dist/roap/index.js +238 -100
  223. package/dist/roap/index.js.map +1 -1
  224. package/dist/roap/request.d.ts +12 -18
  225. package/dist/roap/request.js +180 -126
  226. package/dist/roap/request.js.map +1 -1
  227. package/dist/roap/state.d.ts +9 -0
  228. package/dist/roap/state.js +127 -0
  229. package/dist/roap/state.js.map +1 -0
  230. package/dist/roap/turnDiscovery.d.ts +16 -27
  231. package/dist/roap/turnDiscovery.js +105 -115
  232. package/dist/roap/turnDiscovery.js.map +1 -1
  233. package/dist/roap/util.d.ts +2 -0
  234. package/dist/roap/util.js +76 -0
  235. package/dist/roap/util.js.map +1 -0
  236. package/dist/statsAnalyzer/global.d.ts +83 -1
  237. package/dist/statsAnalyzer/global.js +85 -2
  238. package/dist/statsAnalyzer/global.js.map +1 -1
  239. package/dist/statsAnalyzer/index.d.ts +30 -50
  240. package/dist/statsAnalyzer/index.js +511 -436
  241. package/dist/statsAnalyzer/index.js.map +1 -1
  242. package/dist/statsAnalyzer/mqaUtil.d.ts +6 -8
  243. package/dist/statsAnalyzer/mqaUtil.js +90 -130
  244. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  245. package/dist/transcription/index.js +2 -1
  246. package/dist/transcription/index.js.map +1 -1
  247. package/package.json +26 -39
  248. package/src/common/errors/webex-errors.ts +12 -36
  249. package/src/common/logs/logger-proxy.ts +1 -1
  250. package/src/common/logs/request.ts +1 -5
  251. package/src/common/queue.ts +8 -22
  252. package/src/config.ts +7 -6
  253. package/src/constants.ts +100 -265
  254. package/src/controls-options-manager/enums.ts +0 -12
  255. package/src/controls-options-manager/index.ts +21 -116
  256. package/src/controls-options-manager/util.ts +14 -294
  257. package/src/index.js +15 -0
  258. package/src/locus-info/controlsUtils.ts +0 -110
  259. package/src/locus-info/index.ts +61 -450
  260. package/src/locus-info/infoUtils.ts +2 -14
  261. package/src/locus-info/mediaSharesUtils.ts +0 -64
  262. package/src/locus-info/parser.ts +47 -258
  263. package/src/locus-info/selfUtils.ts +2 -85
  264. package/src/media/index.ts +370 -153
  265. package/src/media/properties.ts +136 -106
  266. package/src/media/util.ts +21 -0
  267. package/src/mediaQualityMetrics/config.ts +377 -244
  268. package/src/meeting/effectsState.ts +209 -0
  269. package/src/meeting/in-meeting-actions.ts +0 -176
  270. package/src/meeting/index.ts +2581 -4306
  271. package/src/meeting/muteState.ts +138 -224
  272. package/src/meeting/request.ts +127 -214
  273. package/src/meeting/util.ts +423 -687
  274. package/src/meeting-info/index.ts +8 -81
  275. package/src/meeting-info/meeting-info-v2.ts +13 -163
  276. package/src/meeting-info/util.ts +1 -1
  277. package/src/meeting-info/utilv2.ts +28 -28
  278. package/src/meetings/collection.ts +0 -33
  279. package/src/meetings/index.ts +136 -531
  280. package/src/meetings/request.ts +0 -2
  281. package/src/meetings/util.ts +5 -116
  282. package/src/member/index.ts +1 -43
  283. package/src/member/util.ts +28 -125
  284. package/src/members/collection.ts +0 -8
  285. package/src/members/index.ts +52 -187
  286. package/src/members/request.ts +27 -87
  287. package/src/members/util.ts +291 -332
  288. package/src/metrics/config.ts +485 -0
  289. package/src/metrics/constants.ts +6 -15
  290. package/src/metrics/index.ts +471 -1
  291. package/src/networkQualityMonitor/index.ts +6 -6
  292. package/src/peer-connection-manager/index.ts +847 -0
  293. package/src/peer-connection-manager/util.ts +119 -0
  294. package/src/reachability/index.ts +347 -246
  295. package/src/reachability/request.ts +8 -17
  296. package/src/reactions/reactions.ts +4 -4
  297. package/src/reactions/reactions.type.ts +4 -30
  298. package/src/reconnection-manager/index.ts +156 -168
  299. package/src/recording-controller/index.ts +3 -20
  300. package/src/recording-controller/util.ts +9 -26
  301. package/src/roap/collection.ts +62 -0
  302. package/src/roap/handler.ts +294 -0
  303. package/src/roap/index.ts +241 -96
  304. package/src/roap/request.ts +148 -74
  305. package/src/roap/state.ts +156 -0
  306. package/src/roap/turnDiscovery.ts +56 -62
  307. package/src/roap/util.ts +100 -0
  308. package/src/statsAnalyzer/global.ts +84 -1
  309. package/src/statsAnalyzer/index.ts +645 -479
  310. package/src/statsAnalyzer/mqaUtil.ts +126 -128
  311. package/test/integration/spec/journey.js +264 -320
  312. package/test/integration/spec/space-meeting.js +4 -77
  313. package/test/unit/spec/common/queue.js +2 -31
  314. package/test/unit/spec/controls-options-manager/index.js +0 -163
  315. package/test/unit/spec/controls-options-manager/util.js +60 -576
  316. package/test/unit/spec/fixture/locus.js +0 -1
  317. package/test/unit/spec/locus-info/controlsUtils.js +30 -323
  318. package/test/unit/spec/locus-info/index.js +15 -1437
  319. package/test/unit/spec/locus-info/infoUtils.js +16 -54
  320. package/test/unit/spec/locus-info/lib/SeqCmp.json +0 -16
  321. package/test/unit/spec/locus-info/lib/selfConstant.js +0 -48
  322. package/test/unit/spec/locus-info/parser.js +35 -116
  323. package/test/unit/spec/locus-info/selfUtils.js +0 -275
  324. package/test/unit/spec/media/properties.ts +84 -75
  325. package/test/unit/spec/meeting/effectsState.js +281 -0
  326. package/test/unit/spec/meeting/in-meeting-actions.ts +0 -86
  327. package/test/unit/spec/meeting/index.js +2313 -8384
  328. package/test/unit/spec/meeting/muteState.js +213 -409
  329. package/test/unit/spec/meeting/request.js +43 -523
  330. package/test/unit/spec/meeting/utils.js +24 -834
  331. package/test/unit/spec/meeting-info/meetinginfov2.js +5 -527
  332. package/test/unit/spec/meeting-info/utilv2.js +0 -21
  333. package/test/unit/spec/meetings/collection.js +0 -26
  334. package/test/unit/spec/meetings/index.js +232 -1445
  335. package/test/unit/spec/meetings/utils.js +2 -202
  336. package/test/unit/spec/member/index.js +9 -32
  337. package/test/unit/spec/member/util.js +61 -499
  338. package/test/unit/spec/members/index.js +5 -394
  339. package/test/unit/spec/members/request.js +27 -206
  340. package/test/unit/spec/members/utils.js +38 -173
  341. package/test/unit/spec/metrics/index.js +50 -1
  342. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  343. package/test/unit/spec/peerconnection-manager/index.js +218 -0
  344. package/test/unit/spec/peerconnection-manager/utils.js +49 -0
  345. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +388 -0
  346. package/test/unit/spec/reachability/index.ts +24 -532
  347. package/test/unit/spec/reconnection-manager/index.js +24 -163
  348. package/test/unit/spec/recording-controller/index.js +218 -293
  349. package/test/unit/spec/recording-controller/util.js +96 -223
  350. package/test/unit/spec/roap/index.ts +77 -187
  351. package/test/unit/spec/roap/turnDiscovery.ts +48 -86
  352. package/test/unit/spec/roap/util.js +30 -0
  353. package/test/unit/spec/stats-analyzer/index.js +165 -644
  354. package/test/utils/testUtils.js +45 -0
  355. package/test/utils/webex-config.js +0 -4
  356. package/test/utils/webex-test-users.js +3 -7
  357. package/dist/annotation/annotation.types.d.ts +0 -42
  358. package/dist/annotation/annotation.types.js +0 -7
  359. package/dist/annotation/annotation.types.js.map +0 -1
  360. package/dist/annotation/constants.d.ts +0 -31
  361. package/dist/annotation/constants.js +0 -41
  362. package/dist/annotation/constants.js.map +0 -1
  363. package/dist/annotation/index.d.ts +0 -117
  364. package/dist/annotation/index.js +0 -357
  365. package/dist/annotation/index.js.map +0 -1
  366. package/dist/breakouts/breakout.d.ts +0 -8
  367. package/dist/breakouts/breakout.js +0 -215
  368. package/dist/breakouts/breakout.js.map +0 -1
  369. package/dist/breakouts/collection.d.ts +0 -5
  370. package/dist/breakouts/collection.js +0 -22
  371. package/dist/breakouts/collection.js.map +0 -1
  372. package/dist/breakouts/edit-lock-error.d.ts +0 -15
  373. package/dist/breakouts/edit-lock-error.js +0 -51
  374. package/dist/breakouts/edit-lock-error.js.map +0 -1
  375. package/dist/breakouts/events.d.ts +0 -8
  376. package/dist/breakouts/events.js +0 -44
  377. package/dist/breakouts/events.js.map +0 -1
  378. package/dist/breakouts/index.d.ts +0 -5
  379. package/dist/breakouts/index.js +0 -1047
  380. package/dist/breakouts/index.js.map +0 -1
  381. package/dist/breakouts/request.d.ts +0 -22
  382. package/dist/breakouts/request.js +0 -77
  383. package/dist/breakouts/request.js.map +0 -1
  384. package/dist/breakouts/utils.d.ts +0 -15
  385. package/dist/breakouts/utils.js +0 -64
  386. package/dist/breakouts/utils.js.map +0 -1
  387. package/dist/common/errors/no-meeting-info.d.ts +0 -14
  388. package/dist/common/errors/no-meeting-info.js +0 -50
  389. package/dist/common/errors/no-meeting-info.js.map +0 -1
  390. package/dist/common/errors/reclaim-host-role-errors.js.map +0 -1
  391. package/dist/controls-options-manager/types.d.ts +0 -43
  392. package/dist/controls-options-manager/types.js +0 -7
  393. package/dist/controls-options-manager/types.js.map +0 -1
  394. package/dist/interceptors/index.d.ts +0 -2
  395. package/dist/interceptors/index.js +0 -15
  396. package/dist/interceptors/index.js.map +0 -1
  397. package/dist/interceptors/locusRetry.d.ts +0 -27
  398. package/dist/interceptors/locusRetry.js +0 -94
  399. package/dist/interceptors/locusRetry.js.map +0 -1
  400. package/dist/interpretation/collection.d.ts +0 -5
  401. package/dist/interpretation/collection.js +0 -22
  402. package/dist/interpretation/collection.js.map +0 -1
  403. package/dist/interpretation/index.d.ts +0 -5
  404. package/dist/interpretation/index.js +0 -365
  405. package/dist/interpretation/index.js.map +0 -1
  406. package/dist/interpretation/siLanguage.d.ts +0 -5
  407. package/dist/interpretation/siLanguage.js +0 -24
  408. package/dist/interpretation/siLanguage.js.map +0 -1
  409. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  410. package/dist/meeting/locusMediaRequest.js +0 -291
  411. package/dist/meeting/locusMediaRequest.js.map +0 -1
  412. package/dist/meeting/request.type.d.ts +0 -11
  413. package/dist/meeting/request.type.js +0 -7
  414. package/dist/meeting/request.type.js.map +0 -1
  415. package/dist/meeting/voicea-meeting.d.ts +0 -20
  416. package/dist/meeting/voicea-meeting.js +0 -201
  417. package/dist/meeting/voicea-meeting.js.map +0 -1
  418. package/dist/meetings/meetings.types.d.ts +0 -4
  419. package/dist/meetings/meetings.types.js +0 -7
  420. package/dist/meetings/meetings.types.js.map +0 -1
  421. package/dist/member/types.d.ts +0 -32
  422. package/dist/member/types.js +0 -23
  423. package/dist/member/types.js.map +0 -1
  424. package/dist/multistream/mediaRequestManager.d.ts +0 -118
  425. package/dist/multistream/mediaRequestManager.js +0 -344
  426. package/dist/multistream/mediaRequestManager.js.map +0 -1
  427. package/dist/multistream/receiveSlot.d.ts +0 -68
  428. package/dist/multistream/receiveSlot.js +0 -200
  429. package/dist/multistream/receiveSlot.js.map +0 -1
  430. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  431. package/dist/multistream/receiveSlotManager.js +0 -174
  432. package/dist/multistream/receiveSlotManager.js.map +0 -1
  433. package/dist/multistream/remoteMedia.d.ts +0 -72
  434. package/dist/multistream/remoteMedia.js +0 -268
  435. package/dist/multistream/remoteMedia.js.map +0 -1
  436. package/dist/multistream/remoteMediaGroup.d.ts +0 -47
  437. package/dist/multistream/remoteMediaGroup.js +0 -267
  438. package/dist/multistream/remoteMediaGroup.js.map +0 -1
  439. package/dist/multistream/remoteMediaManager.d.ts +0 -285
  440. package/dist/multistream/remoteMediaManager.js +0 -1211
  441. package/dist/multistream/remoteMediaManager.js.map +0 -1
  442. package/dist/multistream/sendSlotManager.d.ts +0 -61
  443. package/dist/multistream/sendSlotManager.js +0 -236
  444. package/dist/multistream/sendSlotManager.js.map +0 -1
  445. package/dist/reachability/clusterReachability.d.ts +0 -109
  446. package/dist/reachability/clusterReachability.js +0 -357
  447. package/dist/reachability/clusterReachability.js.map +0 -1
  448. package/dist/reachability/util.d.ts +0 -8
  449. package/dist/reachability/util.js +0 -29
  450. package/dist/reachability/util.js.map +0 -1
  451. package/dist/reactions/constants.d.ts +0 -3
  452. package/dist/reactions/constants.js +0 -12
  453. package/dist/reactions/constants.js.map +0 -1
  454. package/dist/rtcMetrics/constants.d.ts +0 -4
  455. package/dist/rtcMetrics/constants.js +0 -11
  456. package/dist/rtcMetrics/constants.js.map +0 -1
  457. package/dist/rtcMetrics/index.d.ts +0 -54
  458. package/dist/rtcMetrics/index.js +0 -140
  459. package/dist/rtcMetrics/index.js.map +0 -1
  460. package/dist/webinar/collection.d.ts +0 -16
  461. package/dist/webinar/collection.js +0 -43
  462. package/dist/webinar/collection.js.map +0 -1
  463. package/dist/webinar/index.d.ts +0 -5
  464. package/dist/webinar/index.js +0 -68
  465. package/dist/webinar/index.js.map +0 -1
  466. package/src/annotation/annotation.types.ts +0 -50
  467. package/src/annotation/constants.ts +0 -36
  468. package/src/annotation/index.ts +0 -328
  469. package/src/breakouts/README.md +0 -220
  470. package/src/breakouts/breakout.ts +0 -188
  471. package/src/breakouts/collection.ts +0 -19
  472. package/src/breakouts/edit-lock-error.ts +0 -25
  473. package/src/breakouts/events.ts +0 -56
  474. package/src/breakouts/index.ts +0 -925
  475. package/src/breakouts/request.ts +0 -55
  476. package/src/breakouts/utils.ts +0 -57
  477. package/src/common/errors/no-meeting-info.ts +0 -24
  478. package/src/controls-options-manager/types.ts +0 -59
  479. package/src/index.ts +0 -44
  480. package/src/interceptors/index.ts +0 -3
  481. package/src/interceptors/locusRetry.ts +0 -67
  482. package/src/interpretation/README.md +0 -60
  483. package/src/interpretation/collection.ts +0 -19
  484. package/src/interpretation/index.ts +0 -332
  485. package/src/interpretation/siLanguage.ts +0 -18
  486. package/src/meeting/locusMediaRequest.ts +0 -313
  487. package/src/meeting/request.type.ts +0 -13
  488. package/src/meeting/voicea-meeting.ts +0 -161
  489. package/src/meetings/meetings.types.ts +0 -12
  490. package/src/member/types.ts +0 -38
  491. package/src/multistream/mediaRequestManager.ts +0 -440
  492. package/src/multistream/receiveSlot.ts +0 -184
  493. package/src/multistream/receiveSlotManager.ts +0 -166
  494. package/src/multistream/remoteMedia.ts +0 -254
  495. package/src/multistream/remoteMediaGroup.ts +0 -284
  496. package/src/multistream/remoteMediaManager.ts +0 -1145
  497. package/src/multistream/sendSlotManager.ts +0 -170
  498. package/src/reachability/clusterReachability.ts +0 -320
  499. package/src/reachability/util.ts +0 -24
  500. package/src/reactions/constants.ts +0 -4
  501. package/src/rtcMetrics/constants.ts +0 -3
  502. package/src/rtcMetrics/index.ts +0 -124
  503. package/src/webinar/collection.ts +0 -31
  504. package/src/webinar/index.ts +0 -62
  505. package/test/integration/spec/converged-space-meetings.js +0 -233
  506. package/test/unit/spec/annotation/index.ts +0 -418
  507. package/test/unit/spec/breakouts/breakout.ts +0 -237
  508. package/test/unit/spec/breakouts/collection.ts +0 -15
  509. package/test/unit/spec/breakouts/edit-lock-error.ts +0 -30
  510. package/test/unit/spec/breakouts/events.ts +0 -89
  511. package/test/unit/spec/breakouts/index.ts +0 -1790
  512. package/test/unit/spec/breakouts/request.ts +0 -104
  513. package/test/unit/spec/breakouts/utils.js +0 -72
  514. package/test/unit/spec/interceptors/locusRetry.ts +0 -131
  515. package/test/unit/spec/interpretation/collection.ts +0 -15
  516. package/test/unit/spec/interpretation/index.ts +0 -589
  517. package/test/unit/spec/interpretation/siLanguage.ts +0 -28
  518. package/test/unit/spec/locus-info/mediaSharesUtils.ts +0 -32
  519. package/test/unit/spec/media/index.ts +0 -290
  520. package/test/unit/spec/meeting/locusMediaRequest.ts +0 -442
  521. package/test/unit/spec/meeting-info/index.js +0 -300
  522. package/test/unit/spec/multistream/mediaRequestManager.ts +0 -1418
  523. package/test/unit/spec/multistream/receiveSlot.ts +0 -163
  524. package/test/unit/spec/multistream/receiveSlotManager.ts +0 -203
  525. package/test/unit/spec/multistream/remoteMedia.ts +0 -255
  526. package/test/unit/spec/multistream/remoteMediaGroup.ts +0 -662
  527. package/test/unit/spec/multistream/remoteMediaManager.ts +0 -1924
  528. package/test/unit/spec/multistream/sendSlotManager.ts +0 -242
  529. package/test/unit/spec/reachability/clusterReachability.ts +0 -279
  530. package/test/unit/spec/reachability/request.js +0 -68
  531. package/test/unit/spec/reachability/util.ts +0 -40
  532. package/test/unit/spec/roap/request.ts +0 -255
  533. package/test/unit/spec/rtcMetrics/index.ts +0 -93
  534. package/test/unit/spec/webinar/collection.ts +0 -13
  535. package/test/unit/spec/webinar/index.ts +0 -60
  536. package/test/utils/constants.js +0 -9
  537. package/test/utils/integrationTestUtils.js +0 -46
  538. /package/dist/common/errors/{reclaim-host-role-errors.d.ts → reclaim-host-role-error.d.ts} +0 -0
  539. /package/src/common/errors/{reclaim-host-role-errors.ts → reclaim-host-role-error.ts} +0 -0
@@ -2,14 +2,10 @@ import 'jsdom-global/register';
2
2
  import chai from 'chai';
3
3
  import chaiAsPromised from 'chai-as-promised';
4
4
  import sinon from 'sinon';
5
- import {ConnectionState} from '@webex/internal-media-core';
6
5
 
7
6
  import {StatsAnalyzer, EVENTS} from '../../../../src/statsAnalyzer';
8
7
  import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
9
8
  import testUtils from '../../../utils/testUtils';
10
- import {MEDIA_DEVICES, MQA_INTERVAL, _UNKNOWN_} from '@webex/plugin-meetings/src/constants';
11
- import LoggerProxy from '../../../../src/common/logs/logger-proxy';
12
- import LoggerConfig from '../../../../src/common/logs/logger-config';
13
9
 
14
10
  const {assert} = chai;
15
11
 
@@ -18,156 +14,6 @@ sinon.assert.expose(chai.assert, {prefix: ''});
18
14
 
19
15
  describe('plugin-meetings', () => {
20
16
  describe('StatsAnalyzer', () => {
21
- describe('parseStatsResult', () => {
22
- const sandbox = sinon.createSandbox();
23
- let statsAnalyzer;
24
-
25
- const initialConfig = {};
26
- const defaultStats = {};
27
-
28
- beforeEach(() => {
29
- const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
30
-
31
- statsAnalyzer = new StatsAnalyzer(
32
- initialConfig,
33
- () => ({}),
34
- networkQualityMonitor,
35
- defaultStats
36
- );
37
- });
38
-
39
- afterEach(() => {
40
- sandbox.reset();
41
- });
42
-
43
- it('should call processOutboundRTPResult', () => {
44
- const calledSpy = sandbox.spy(statsAnalyzer, 'processOutboundRTPResult');
45
- statsAnalyzer.parseGetStatsResult({ type: 'outbound-rtp' }, 'video-send');
46
- assert(calledSpy.calledOnce);
47
- });
48
-
49
- it('should call processInboundRTPResult', () => {
50
- const calledSpy = sandbox.spy(statsAnalyzer, 'processInboundRTPResult');
51
- statsAnalyzer.parseGetStatsResult({ type: 'inbound-rtp' }, 'video-recv');
52
- assert(calledSpy.calledOnce);
53
- });
54
-
55
- it('should call compareSentAndReceived', () => {
56
- const calledSpy = sandbox.spy(statsAnalyzer, 'compareSentAndReceived');
57
- statsAnalyzer.parseGetStatsResult({ type: 'remote-outbound-rtp' }, 'video-send');
58
- assert(calledSpy.calledOnce);
59
- });
60
-
61
- it('should call parseCandidate', () => {
62
- const calledSpy = sandbox.spy(statsAnalyzer, 'parseCandidate');
63
- statsAnalyzer.parseGetStatsResult({ type: 'local-candidate' }, 'video-send');
64
- assert(calledSpy.calledOnce);
65
- });
66
-
67
- it('processOutboundRTPResult should create the correct stats results', () => {
68
- // establish the `statsResults` object.
69
- statsAnalyzer.parseGetStatsResult({ type: 'none' }, 'audio-send', true);
70
-
71
- statsAnalyzer.processOutboundRTPResult({
72
- bytesSent: 50000,
73
- codecId: "RTCCodec_1_Outbound_111",
74
- headerBytesSent: 25000,
75
- id: "RTCOutboundRTPAudioStream_123456789",
76
- kind: "audio",
77
- mediaSourceId: "RTCAudioSource_2",
78
- mediaType: "audio",
79
- nackCount: 1,
80
- packetsSent: 3600,
81
- remoteId: "RTCRemoteInboundRtpAudioStream_123456789",
82
- retransmittedBytesSent: 100,
83
- retransmittedPacketsSent: 2,
84
- ssrc: 123456789,
85
- targetBitrate: 256000,
86
- timestamp: 1707341489336,
87
- trackId: "RTCMediaStreamTrack_sender_2",
88
- transportId: "RTCTransport_0_1",
89
- type: "outbound-rtp",
90
- }, 'audio-send', true);
91
-
92
- assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.headerBytesSent, 25000);
93
- assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.totalBytesSent, 50000);
94
- assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.totalNackCount, 1);
95
- assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.totalPacketsSent, 3600)
96
- assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.retransmittedPacketsSent, 2);
97
- assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.retransmittedBytesSent, 100);
98
- });
99
-
100
- it('processInboundRTPResult should create the correct stats results', () => {
101
- // establish the `statsResults` object.
102
- statsAnalyzer.parseGetStatsResult({ type: 'none' }, 'audio-recv-1', false);
103
-
104
- statsAnalyzer.processInboundRTPResult({
105
- audioLevel: 0,
106
- bytesReceived: 509,
107
- codecId: "RTCCodec_6_Inbound_111",
108
- concealedSamples: 200000,
109
- concealmentEvents: 13,
110
- fecPacketsDiscarded: 1,
111
- fecPacketsReceived: 1,
112
- headerBytesReceived: 250,
113
- id: "RTCInboundRTPAudioStream_123456789",
114
- insertedSamplesForDeceleration: 0,
115
- jitter: 0.012,
116
- jitterBufferDelay: 1000,
117
- jitterBufferEmittedCount: 10000,
118
- kind: "audio",
119
- lastPacketReceivedTimestamp: 1707341488529,
120
- mediaType: "audio",
121
- packetsDiscarded: 0,
122
- packetsLost: 0,
123
- packetsReceived: 12,
124
- remoteId: "RTCRemoteOutboundRTPAudioStream_123456789",
125
- removedSamplesForAcceleration: 0,
126
- silentConcealedSamples: 200000,
127
- ssrc: 123456789,
128
- timestamp: 1707341489419,
129
- totalAudioEnergy: 133,
130
- totalSamplesDuration: 7,
131
- totalSamplesReceived: 300000,
132
- trackId: "RTCMediaStreamTrack_receiver_76",
133
- transportId: "RTCTransport_0_1",
134
- type: "inbound-rtp",
135
- }, 'audio-recv-1', false);
136
-
137
- assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.totalPacketsReceived, 12);
138
- assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.fecPacketsDiscarded, 1);
139
- assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.fecPacketsReceived, 1);
140
- assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.totalBytesReceived, 509);
141
- assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.headerBytesReceived, 250);
142
- assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.audioLevel, 0);
143
- assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.totalAudioEnergy, 133);
144
- assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.totalSamplesReceived, 300000);
145
- assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.totalSamplesDecoded, 0);
146
- assert.strictEqual(statsAnalyzer.statsResults['audio-recv-1'].recv.concealedSamples, 200000);
147
- });
148
-
149
- it('parseAudioSource should create the correct stats results', () => {
150
- // establish the `statsResults` object.
151
- statsAnalyzer.parseGetStatsResult({ type: 'none' }, 'audio-send', true);
152
-
153
- statsAnalyzer.parseAudioSource({
154
- audioLevel: 0.03,
155
- echoReturnLoss: -30,
156
- echoReturnLossEnhancement: 0.17,
157
- id: "RTCAudioSource_2",
158
- kind: "audio",
159
- timestamp: 1707341488160.012,
160
- totalAudioEnergy: 0.001,
161
- totalSamplesDuration: 4.5,
162
- trackIdentifier: "2207e5bf-c595-4301-93f7-283994d8143f",
163
- type: "media-source",
164
- }, 'audio-send', true);
165
-
166
- assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.audioLevel, 0.03);
167
- assert.strictEqual(statsAnalyzer.statsResults['audio-send'].send.totalAudioEnergy, 0.001);
168
- });
169
- });
170
-
171
17
  describe('compareSentAndReceived()', () => {
172
18
  let statsAnalyzer;
173
19
  let sandBoxSpy;
@@ -177,15 +23,14 @@ describe('plugin-meetings', () => {
177
23
  };
178
24
 
179
25
  const defaultStats = {
180
- resolutions: {},
181
26
  internal: {
182
- 'video-send-1': {
27
+ video: {
183
28
  send: {
184
29
  totalPacketsLostOnReceiver: 10,
185
30
  },
186
31
  },
187
32
  },
188
- 'video-send-1': {
33
+ video: {
189
34
  send: {
190
35
  packetsSent: 2,
191
36
  meanRemoteJitter: [],
@@ -206,12 +51,7 @@ describe('plugin-meetings', () => {
206
51
  beforeEach(() => {
207
52
  const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
208
53
 
209
- statsAnalyzer = new StatsAnalyzer(
210
- initialConfig,
211
- () => ({}),
212
- networkQualityMonitor,
213
- defaultStats
214
- );
54
+ statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor, defaultStats);
215
55
 
216
56
  sandBoxSpy = sandbox.spy(
217
57
  statsAnalyzer.networkQualityMonitor,
@@ -224,12 +64,12 @@ describe('plugin-meetings', () => {
224
64
  });
225
65
 
226
66
  it('should trigger determineUplinkNetworkQuality with specific arguments', async () => {
227
- await statsAnalyzer.parseGetStatsResult(statusResult, 'video-send-1', true);
67
+ await statsAnalyzer.parseGetStatsResult(statusResult, 'video');
228
68
 
229
69
  assert.calledOnce(statsAnalyzer.networkQualityMonitor.determineUplinkNetworkQuality);
230
70
  assert(
231
71
  sandBoxSpy.calledWith({
232
- mediaType: 'video-send-1',
72
+ mediaType: 'video',
233
73
  remoteRtpResults: statusResult,
234
74
  statsAnalyzerCurrentStats: statsAnalyzer.statsResults,
235
75
  })
@@ -242,8 +82,22 @@ describe('plugin-meetings', () => {
242
82
  let pc;
243
83
  let networkQualityMonitor;
244
84
  let statsAnalyzer;
245
- let mqeData;
246
- let loggerSpy;
85
+ const statusResultOutboundRTP = {
86
+ type: 'outbound-rtp',
87
+ frameHeight: 720,
88
+ frameWidth: 1280,
89
+ packetsLost: 11,
90
+ framesSent: 105,
91
+ hugeFramesSent: 1,
92
+ framesEncoded: 102,
93
+ rttThreshold: 501,
94
+ jitterThreshold: 501,
95
+ jitterBufferDelay: 288.131459,
96
+ jitterBufferEmittedCount: 4013,
97
+ trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
98
+ bytesSent: 1233,
99
+ totalPacketsSent: 100,
100
+ };
247
101
 
248
102
  let receivedEventsData = {
249
103
  local: {},
@@ -256,8 +110,6 @@ describe('plugin-meetings', () => {
256
110
 
257
111
  let fakeStats;
258
112
 
259
- const sandbox = sinon.createSandbox();
260
-
261
113
  const resetReceivedEvents = () => {
262
114
  receivedEventsData = {
263
115
  local: {},
@@ -265,12 +117,6 @@ describe('plugin-meetings', () => {
265
117
  };
266
118
  };
267
119
 
268
- before(() => {
269
- LoggerConfig.set({ enable: false });
270
- LoggerProxy.set();
271
- loggerSpy = sandbox.spy(LoggerProxy.logger, 'info');
272
- });
273
-
274
120
  beforeEach(() => {
275
121
  clock = sinon.useFakeTimers();
276
122
 
@@ -279,165 +125,61 @@ describe('plugin-meetings', () => {
279
125
  // bytesReceived and bytesSent need to be non-zero in order for StatsAnalyzer to parse any other values
280
126
  fakeStats = {
281
127
  audio: {
282
- senders: [
283
- {
284
- localTrackLabel: 'fake-microphone',
285
- report: [
286
- {
287
- type: 'outbound-rtp',
288
- bytesSent: 1,
289
- packetsSent: 0,
290
- },
291
- {
292
- type: 'remote-inbound-rtp',
293
- packetsLost: 0,
294
- },
295
- {
296
- type: 'candidate-pair',
297
- state: 'succeeded',
298
- localCandidateId: 'fake-candidate-id',
299
- },
300
- {
301
- type: 'candidate-pair',
302
- state: 'failed',
303
- localCandidateId: 'bad-candidate-id',
304
- },
305
- {
306
- type: 'local-candidate',
307
- id: 'fake-candidate-id',
308
- protocol: 'tcp',
309
- },
310
- ],
311
- },
312
- ],
313
- receivers: [
314
- {
315
- report: [
316
- {
317
- type: 'inbound-rtp',
318
- bytesReceived: 1,
319
- fecPacketsDiscarded: 0,
320
- fecPacketsReceived: 0,
321
- packetsLost: 0,
322
- packetsReceived: 0,
323
- },
324
- {
325
- type: 'remote-outbound-rtp',
326
- },
327
- {
328
- type: 'candidate-pair',
329
- state: 'succeeded',
330
- localCandidateId: 'fake-candidate-id',
331
- },
332
- {
333
- type: 'candidate-pair',
334
- state: 'failed',
335
- localCandidateId: 'bad-candidate-id',
336
- },
337
- {
338
- type: 'local-candidate',
339
- id: 'fake-candidate-id',
340
- protocol: 'tcp',
341
- },
342
- ],
343
- },
344
- ],
128
+ receiver: {
129
+ type: 'inbound-rtp',
130
+ packetsReceived: 0,
131
+ bytesReceived: 1,
132
+ },
133
+ sender: {
134
+ type: 'outbound-rtp',
135
+ packetsSent: 0,
136
+ bytesSent: 1,
137
+ },
345
138
  },
346
139
  video: {
347
- senders: [
348
- {
349
- localTrackLabel: 'fake-camera',
350
- report: [
351
- {
352
- type: 'outbound-rtp',
353
- bytesSent: 1,
354
- framesSent: 0,
355
- packetsSent: 0,
356
- },
357
- {
358
- type: 'remote-inbound-rtp',
359
- packetsLost: 0,
360
- },
361
- {
362
- type: 'candidate-pair',
363
- state: 'succeeded',
364
- localCandidateId: 'fake-candidate-id',
365
- },
366
- {
367
- type: 'candidate-pair',
368
- state: 'failed',
369
- localCandidateId: 'bad-candidate-id',
370
- },
371
- {
372
- type: 'local-candidate',
373
- id: 'fake-candidate-id',
374
- protocol: 'tcp',
375
- },
376
- ],
377
- },
378
- ],
379
- receivers: [
380
- {
381
- report: [
382
- {
383
- type: 'inbound-rtp',
384
- bytesReceived: 1,
385
- frameHeight: 720,
386
- frameWidth: 1280,
387
- framesDecoded: 0,
388
- framesReceived: 0,
389
- packetsLost: 0,
390
- packetsReceived: 0,
391
- },
392
- {
393
- type: 'remote-outbound-rtp',
394
- },
395
- {
396
- type: 'candidate-pair',
397
- state: 'succeeded',
398
- localCandidateId: 'fake-candidate-id',
399
- },
400
- {
401
- type: 'candidate-pair',
402
- state: 'failed',
403
- localCandidateId: 'bad-candidate-id',
404
- },
405
- {
406
- type: 'local-candidate',
407
- id: 'fake-candidate-id',
408
- protocol: 'tcp',
409
- },
410
- ],
411
- },
412
- ],
140
+ receiver: {
141
+ type: 'inbound-rtp',
142
+ framesDecoded: 0,
143
+ bytesReceived: 1,
144
+ },
145
+ sender: {
146
+ type: 'outbound-rtp',
147
+ framesSent: 0,
148
+ bytesSent: 1,
149
+ },
413
150
  },
414
151
  };
415
152
 
416
153
  pc = {
417
- getConnectionState: sinon.stub().returns(ConnectionState.Connected),
418
- getTransceiverStats: sinon.stub().resolves({
419
- audio: {
420
- senders: [fakeStats.audio.senders[0]],
421
- receivers: [fakeStats.audio.receivers[0]],
154
+ audioTransceiver: {
155
+ sender: {
156
+ getStats: sinon.stub().resolves([fakeStats.audio.sender]),
157
+ },
158
+ receiver: {
159
+ getStats: sinon.stub().resolves([fakeStats.audio.receiver]),
422
160
  },
423
- video: {
424
- senders: [fakeStats.video.senders[0]],
425
- receivers: [fakeStats.video.receivers[0]],
161
+ },
162
+ videoTransceiver: {
163
+ sender: {
164
+ getStats: sinon.stub().resolves([fakeStats.video.sender]),
165
+ },
166
+ receiver: {
167
+ getStats: sinon.stub().resolves([fakeStats.video.receiver]),
426
168
  },
427
- screenShareAudio: {
428
- senders: [fakeStats.audio.senders[0]],
429
- receivers: [fakeStats.audio.receivers[0]],
169
+ },
170
+ shareTransceiver: {
171
+ sender: {
172
+ getStats: sinon.stub().resolves([]),
430
173
  },
431
- screenShareVideo: {
432
- senders: [fakeStats.video.senders[0]],
433
- receivers: [fakeStats.video.receivers[0]],
174
+ receiver: {
175
+ getStats: sinon.stub().resolves([]),
434
176
  },
435
- }),
177
+ },
436
178
  };
437
179
 
438
180
  networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
439
181
 
440
- statsAnalyzer = new StatsAnalyzer(initialConfig, () => ({}), networkQualityMonitor);
182
+ statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor);
441
183
 
442
184
  statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STARTED, (data) => {
443
185
  receivedEventsData.local.started = data;
@@ -451,13 +193,15 @@ describe('plugin-meetings', () => {
451
193
  statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
452
194
  receivedEventsData.remote.stopped = data;
453
195
  });
454
- statsAnalyzer.on(EVENTS.MEDIA_QUALITY, ({data}) => {
455
- mqeData = data;
196
+ statsAnalyzer.on(EVENTS.NO_FRAMES_SENT, (data) => {
197
+ receivedEventsData.noFramesSent = data;
198
+ });
199
+ statsAnalyzer.on(EVENTS.NO_VIDEO_ENCODED, (data) => {
200
+ receivedEventsData.noVideoEncoded = data;
456
201
  });
457
202
  });
458
203
 
459
204
  afterEach(() => {
460
- sandbox.reset();
461
205
  clock.restore();
462
206
  });
463
207
 
@@ -468,27 +212,8 @@ describe('plugin-meetings', () => {
468
212
  await testUtils.flushPromises();
469
213
  };
470
214
 
471
- const mergeProperties = (
472
- target,
473
- properties,
474
- keyValue = 'fake-candidate-id',
475
- matchKey = 'type',
476
- matchValue = 'local-candidate'
477
- ) => {
478
- for (let key in target) {
479
- if (target.hasOwnProperty(key)) {
480
- if (typeof target[key] === 'object') {
481
- mergeProperties(target[key], properties, keyValue, matchKey, matchValue);
482
- }
483
- if (key === 'id' && target[key] === keyValue && target[matchKey] === matchValue) {
484
- Object.assign(target, properties);
485
- }
486
- }
487
- }
488
- };
489
-
490
- const progressTime = async (time = initialConfig.analyzerInterval) => {
491
- await clock.tickAsync(time);
215
+ const progressTime = async () => {
216
+ await clock.tickAsync(initialConfig.analyzerInterval);
492
217
  await testUtils.flushPromises();
493
218
  };
494
219
 
@@ -500,23 +225,6 @@ describe('plugin-meetings', () => {
500
225
  assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
501
226
  };
502
227
 
503
- const checkMqeData = () => {
504
- for (const data of [
505
- mqeData.audioTransmit,
506
- mqeData.audioReceive,
507
- mqeData.videoTransmit,
508
- mqeData.videoReceive,
509
- ]) {
510
- assert.strictEqual(data.length, 2);
511
- assert.strictEqual(data[0].common.common.isMain, true);
512
- assert.strictEqual(data[1].common.common.isMain, false);
513
- }
514
-
515
- assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedFrameSize, 3600);
516
- assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedHeight, 720);
517
- assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedWidth, 1280);
518
- };
519
-
520
228
  it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
521
229
  await startStatsAnalyzer({expected: {sendAudio: true}});
522
230
 
@@ -524,7 +232,7 @@ describe('plugin-meetings', () => {
524
232
  checkReceivedEvent({expected: {}});
525
233
 
526
234
  // setup a mock to return some values higher the previous ones
527
- fakeStats.audio.senders[0].report[0].packetsSent += 10;
235
+ fakeStats.audio.sender.packetsSent += 10;
528
236
 
529
237
  await progressTime();
530
238
 
@@ -544,7 +252,7 @@ describe('plugin-meetings', () => {
544
252
  checkReceivedEvent({expected: {}});
545
253
 
546
254
  // setup a mock to return some values higher the previous ones
547
- fakeStats.video.senders[0].report[0].framesSent += 1;
255
+ fakeStats.video.sender.framesSent += 1;
548
256
 
549
257
  await progressTime();
550
258
 
@@ -564,7 +272,7 @@ describe('plugin-meetings', () => {
564
272
  checkReceivedEvent({expected: {}});
565
273
 
566
274
  // setup a mock to return some values higher the previous ones
567
- fakeStats.audio.receivers[0].report[0].packetsReceived += 5;
275
+ fakeStats.audio.receiver.packetsReceived += 5;
568
276
 
569
277
  await progressTime();
570
278
  // check that we got the REMOTE_MEDIA_STARTED event for audio
@@ -584,7 +292,7 @@ describe('plugin-meetings', () => {
584
292
  checkReceivedEvent({expected: {}});
585
293
 
586
294
  // setup a mock to return some values higher the previous ones
587
- fakeStats.video.receivers[0].report[0].framesDecoded += 1;
295
+ fakeStats.video.receiver.framesDecoded += 1;
588
296
 
589
297
  await progressTime();
590
298
  // check that we got the REMOTE_MEDIA_STARTED event for video
@@ -597,320 +305,133 @@ describe('plugin-meetings', () => {
597
305
  checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
598
306
  });
599
307
 
600
- it('emits the correct MEDIA_QUALITY events', async () => {
601
- await startStatsAnalyzer({expected: {receiveVideo: true}});
602
-
603
- await progressTime();
604
-
605
- // Check that the mqe data has been emitted and is correctly computed.
606
- checkMqeData();
607
- });
608
-
609
- it('emits the correct transportType in MEDIA_QUALITY events', async () => {
610
- await startStatsAnalyzer({expected: {receiveVideo: true}});
611
-
612
- await progressTime();
613
-
614
- assert.strictEqual(mqeData.audioTransmit[0].common.transportType, 'TCP');
615
- assert.strictEqual(mqeData.videoReceive[0].common.transportType, 'TCP');
616
- });
617
-
618
- it('emits the correct transportType in MEDIA_QUALITY events when using a TURN server', async () => {
619
- fakeStats.audio.senders[0].report[4].relayProtocol = 'tls';
620
- fakeStats.video.senders[0].report[4].relayProtocol = 'tls';
621
- fakeStats.audio.receivers[0].report[4].relayProtocol = 'tls';
622
- fakeStats.video.receivers[0].report[4].relayProtocol = 'tls';
623
-
624
- await startStatsAnalyzer({expected: {receiveVideo: true}});
625
-
626
- await progressTime();
627
-
628
- assert.strictEqual(mqeData.audioTransmit[0].common.transportType, 'TLS');
629
- assert.strictEqual(mqeData.videoReceive[0].common.transportType, 'TLS');
630
- });
308
+ const checkStats = (type) => {
309
+ const statsResult = {
310
+ height: 720,
311
+ width: 1280,
312
+ jitterBufferDelay: 288.131459,
313
+ jitterBufferEmittedCount: 4013,
314
+ trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
315
+ avgJitterDelay: 0.07179951632195365,
316
+ };
317
+ if (type === 'inbound-rtp') {
318
+ statsResult.framesDecoded = 4013;
319
+ statsResult.framesDropped = 0;
320
+ statsResult.framesReceived = 4016;
321
+ assert.deepEqual(statsAnalyzer.statsResults.resolutions.video.recv, statsResult);
322
+ } else if (type === 'outbound-rtp') {
323
+ statsResult.framesSent = 105;
324
+ statsResult.hugeFramesSent = 1;
325
+ assert.deepEqual(statsAnalyzer.statsResults.resolutions.video.send, statsResult);
326
+ }
327
+ };
631
328
 
632
- it('emits the correct peripherals in MEDIA_QUALITY events', async () => {
329
+ it('processes track results and populate statsResults.resolutions object when type is inbound-rtp with video', async () => {
633
330
  await startStatsAnalyzer({expected: {receiveVideo: true}});
634
-
635
- await progressTime();
636
-
637
- assert.strictEqual(
638
- mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.MICROPHONE)
639
- .information,
640
- 'fake-microphone'
641
- );
642
- assert.strictEqual(
643
- mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.CAMERA)
644
- .information,
645
- 'fake-camera'
646
- );
331
+ const statusResultInboundRTP = {
332
+ type: 'inbound-rtp',
333
+ frameHeight: 720,
334
+ frameWidth: 1280,
335
+ packetsLost: 11,
336
+ rttThreshold: 501,
337
+ jitterThreshold: 501,
338
+ framesDecoded: 4013,
339
+ framesDropped: 0,
340
+ framesReceived: 4016,
341
+ jitterBufferDelay: 288.131459,
342
+ jitterBufferEmittedCount: 4013,
343
+ trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
344
+ };
345
+ await statsAnalyzer.parseGetStatsResult(statusResultInboundRTP, 'video');
346
+ checkStats('inbound-rtp');
647
347
  });
648
-
649
- it('emits the correct peripherals in MEDIA_QUALITY events when localTrackLabel is undefined', async () => {
650
- fakeStats.audio.senders[0].localTrackLabel = undefined;
651
- fakeStats.video.senders[0].localTrackLabel = undefined;
652
-
348
+ it('processes track results and populate statsResults.resolutions object when type is outbound-rtp with video', async () => {
653
349
  await startStatsAnalyzer({expected: {receiveVideo: true}});
654
350
 
655
- await progressTime();
656
-
657
- assert.strictEqual(
658
- mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.MICROPHONE)
659
- .information,
660
- _UNKNOWN_
661
- );
662
- assert.strictEqual(
663
- mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.CAMERA)
664
- .information,
665
- _UNKNOWN_
666
- );
667
- });
668
-
669
- it('emits the correct transmittedFrameRate/receivedFrameRate', async () => {
670
- it('at the start of the stats analyzer', async () => {
671
- await startStatsAnalyzer();
672
- assert.strictEqual(mqeData.videoTransmit[0].streams[0].common.transmittedFrameRate, 0);
673
- assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 0);
674
- });
675
-
676
- it('after frames are sent and received', async () => {
677
- fakeStats.video.senders[0].report[0].framesSent += 300;
678
- fakeStats.video.receivers[0].report[0].framesReceived += 300;
679
- await progressTime(MQA_INTERVAL);
680
-
681
- // 300 frames in 60 seconds = 5 frames per second
682
- assert.strictEqual(mqeData.videoTransmit[0].streams[0].common.transmittedFrameRate, 5);
683
- assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 5);
684
- });
685
- });
686
-
687
- it('emits the correct rtpPackets', async () => {
688
- it('at the start of the stats analyzer', async () => {
689
- await startStatsAnalyzer();
690
- assert.strictEqual(mqeData.audioTransmit[0].common.rtpPackets, 0);
691
- assert.strictEqual(mqeData.audioTransmit[0].streams[0].common.rtpPackets, 0);
692
- assert.strictEqual(mqeData.audioReceive[0].common.rtpPackets, 0);
693
- assert.strictEqual(mqeData.audioReceive[0].streams[0].common.rtpPackets, 0);
694
- assert.strictEqual(mqeData.videoTransmit[0].common.rtpPackets, 0);
695
- assert.strictEqual(mqeData.videoTransmit[0].streams[0].common.rtpPackets, 0);
696
- assert.strictEqual(mqeData.videoReceive[0].common.rtpPackets, 0);
697
- assert.strictEqual(mqeData.videoReceive[0].streams[0].common.rtpPackets, 0);
698
- });
699
-
700
- it('after packets are sent', async () => {
701
- fakeStats.audio.senders[0].report[0].packetsSent += 5;
702
- fakeStats.video.senders[0].report[0].packetsSent += 5;
703
- await progressTime(MQA_INTERVAL);
704
-
705
- assert.strictEqual(mqeData.audioTransmit[0].common.rtpPackets, 5);
706
- assert.strictEqual(mqeData.audioTransmit[0].streams[0].common.rtpPackets, 5);
707
- assert.strictEqual(mqeData.videoTransmit[0].common.rtpPackets, 5);
708
- assert.strictEqual(mqeData.videoTransmit[0].streams[0].common.rtpPackets, 5);
709
- });
710
-
711
- it('after packets are received', async () => {
712
- fakeStats.audio.senders[0].report[0].packetsSent += 10;
713
- fakeStats.video.senders[0].report[0].packetsSent += 10;
714
- fakeStats.audio.receivers[0].report[0].packetsReceived += 10;
715
- fakeStats.video.receivers[0].report[0].packetsReceived += 10;
716
- await progressTime(MQA_INTERVAL);
717
-
718
- assert.strictEqual(mqeData.audioReceive[0].common.rtpPackets, 10);
719
- assert.strictEqual(mqeData.audioReceive[0].streams[0].common.rtpPackets, 10);
720
- assert.strictEqual(mqeData.videoReceive[0].common.rtpPackets, 10);
721
- assert.strictEqual(mqeData.videoReceive[0].streams[0].common.rtpPackets, 10);
722
- });
723
- });
724
-
725
- it('emits the correct fecPackets', async () => {
726
- it('at the start of the stats analyzer', async () => {
727
- await startStatsAnalyzer();
728
- assert.strictEqual(mqeData.audioReceive[0].common.fecPackets, 0);
729
- });
730
-
731
- it('after FEC packets are received', async () => {
732
- fakeStats.audio.receivers[0].report[0].fecPacketsReceived += 5;
733
- await progressTime(MQA_INTERVAL);
734
-
735
- assert.strictEqual(mqeData.audioReceive[0].common.fecPackets, 5);
736
- });
737
-
738
- it('after FEC packets are received and some FEC packets are discarded', async () => {
739
- fakeStats.audio.receivers[0].report[0].fecPacketsReceived += 15;
740
- fakeStats.audio.receivers[0].report[0].fecPacketsDiscarded += 5;
741
- await progressTime(MQA_INTERVAL);
742
-
743
- assert.strictEqual(mqeData.audioReceive[0].common.fecPackets, 10);
744
- });
745
- });
746
-
747
- it('emits the correct mediaHopByHopLost/rtpHopByHopLost', async () => {
748
- it('at the start of the stats analyzer', async () => {
749
- await startStatsAnalyzer();
750
- assert.strictEqual(mqeData.audioReceive[0].common.mediaHopByHopLost, 0);
751
- assert.strictEqual(mqeData.audioReceive[0].common.rtpHopByHopLost, 0);
752
- assert.strictEqual(mqeData.videoReceive[0].common.mediaHopByHopLost, 0);
753
- assert.strictEqual(mqeData.videoReceive[0].common.rtpHopByHopLost, 0);
754
- });
755
-
756
- it('after packets are lost', async () => {
757
- fakeStats.audio.receivers[0].report[0].packetsLost += 5;
758
- fakeStats.video.receivers[0].report[0].packetsLost += 5;
759
- await progressTime(MQA_INTERVAL);
760
-
761
- assert.strictEqual(mqeData.audioReceive[0].common.mediaHopByHopLost, 5);
762
- assert.strictEqual(mqeData.audioReceive[0].common.rtpHopByHopLost, 5);
763
- assert.strictEqual(mqeData.videoReceive[0].common.mediaHopByHopLost, 5);
764
- assert.strictEqual(mqeData.videoReceive[0].common.rtpHopByHopLost, 5);
765
- });
766
- });
767
-
768
- it('emits the correct remoteLossRate', async () => {
769
- it('at the start of the stats analyzer', async () => {
770
- await startStatsAnalyzer();
771
- assert.strictEqual(mqeData.audioTransmit[0].common.remoteLossRate, 0);
772
- assert.strictEqual(mqeData.videoTransmit[0].common.remoteLossRate, 0);
773
- });
774
-
775
- it('after packets are sent', async () => {
776
- fakeStats.audio.senders[0].report[0].packetsSent += 100;
777
- fakeStats.video.senders[0].report[0].packetsSent += 100;
778
- await progressTime(MQA_INTERVAL);
779
-
780
- assert.strictEqual(mqeData.audioTransmit[0].common.remoteLossRate, 0);
781
- assert.strictEqual(mqeData.videoTransmit[0].common.remoteLossRate, 0);
782
- });
783
-
784
- it('after packets are sent and some packets are lost', async () => {
785
- fakeStats.audio.senders[0].report[0].packetsSent += 200;
786
- fakeStats.audio.senders[0].report[1].packetsLost += 10;
787
- fakeStats.video.senders[0].report[0].packetsSent += 200;
788
- fakeStats.video.senders[0].report[1].packetsLost += 10;
789
- await progressTime(MQA_INTERVAL);
790
-
791
- assert.strictEqual(mqeData.audioTransmit[0].common.remoteLossRate, 5);
792
- assert.strictEqual(mqeData.videoTransmit[0].common.remoteLossRate, 5);
793
- });
794
- });
795
-
796
- it('has the correct localIpAddress set when the candidateType is host', async () => {
797
- await startStatsAnalyzer();
798
-
799
- await progressTime();
800
- assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
801
- mergeProperties(fakeStats, {address: 'test', candidateType: 'host'});
802
- await progressTime();
803
- assert.strictEqual(statsAnalyzer.getLocalIpAddress(), 'test');
351
+ await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
352
+ checkStats('outbound-rtp');
804
353
  });
805
354
 
806
- it('has the correct localIpAddress set when the candidateType is prflx and relayProtocol is set', async () => {
807
- await startStatsAnalyzer();
808
-
809
- await progressTime();
810
- assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
811
- mergeProperties(fakeStats, {
812
- relayProtocol: 'test',
813
- address: 'test2',
814
- candidateType: 'prflx',
815
- });
816
- await progressTime();
817
- assert.strictEqual(statsAnalyzer.getLocalIpAddress(), 'test2');
355
+ it('doesnot processes track results with audio', async () => {
356
+ await startStatsAnalyzer({expected: {receiveAudio: true}});
357
+ await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'audio');
358
+ assert.deepEqual(statsAnalyzer.statsResults.resolutions.audio, undefined);
818
359
  });
819
360
 
820
- it('has the correct localIpAddress set when the candidateType is prflx and relayProtocol is not set', async () => {
821
- await startStatsAnalyzer();
361
+ it('emits NO_FRAMES_ENCODED when frames are not being encoded', async () => {
362
+ const expected = {mediaType: 'video'};
363
+ await startStatsAnalyzer({expected: {sendVideo: true}});
822
364
 
823
- await progressTime();
824
- assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
825
- mergeProperties(fakeStats, {
826
- relatedAddress: 'relatedAddress',
827
- address: 'test2',
828
- candidateType: 'prflx',
829
- });
830
- await progressTime();
831
- assert.strictEqual(statsAnalyzer.getLocalIpAddress(), 'relatedAddress');
832
- });
365
+ statsAnalyzer.lastStatsResults.video.send = {framesEncoded: 102, totalPacketsSent: 106};
833
366
 
834
- it('has no localIpAddress set when the candidateType is invalid', async () => {
835
- await startStatsAnalyzer();
367
+ await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
836
368
 
837
- await progressTime();
838
- assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
839
- mergeProperties(fakeStats, {candidateType: 'invalid'});
840
- await progressTime();
841
- assert.strictEqual(statsAnalyzer.getLocalIpAddress(), '');
369
+ statsAnalyzer.compareLastStatsResult();
370
+ assert.deepEqual(receivedEventsData.noVideoEncoded, expected);
842
371
  });
843
372
 
844
- it('logs a message when audio send packets do not increase', async () => {
845
- await startStatsAnalyzer({expected: {sendAudio: true}});
846
-
847
- // don't increase the packets when time progresses.
848
- await progressTime();
373
+ it('emits NO_FRAMES_SENT when frames are not being sent but frames are being encoded', async () => {
374
+ await startStatsAnalyzer({expected: {sendVideo: true}});
849
375
 
850
- assert(loggerSpy.calledWith('StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent'));
851
- });
376
+ const expected = {mediaType: 'video'};
852
377
 
853
- it('does not log a message when audio send packets increase', async () => {
854
- await startStatsAnalyzer({expected: {sendAudio: true}});
855
-
856
- fakeStats.audio.senders[0].report[0].packetsSent += 5;
857
- await progressTime();
378
+ statsAnalyzer.lastStatsResults.video.send = {
379
+ framesEncoded: 10,
380
+ framesSent: 105,
381
+ totalPacketsSent: 106,
382
+ };
383
+ await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
858
384
 
859
- assert(loggerSpy.neverCalledWith('StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent'));
385
+ statsAnalyzer.compareLastStatsResult();
386
+ assert.deepEqual(receivedEventsData.noFramesSent, expected);
860
387
  });
861
388
 
862
- it('logs a message when audio receive packets do not increase', async () => {
863
- await startStatsAnalyzer({expected: {receiveAudio: true}});
389
+ it('doesnot emits NO_FRAMES_SENT when last emitted event is LOCAL_MEDIA_STOPPED', async () => {
390
+ statsAnalyzer.lastEmittedStartStopEvent.video.local = EVENTS.LOCAL_MEDIA_STOPPED;
864
391
 
865
- // don't increase the packets when time progresses.
866
- await progressTime();
392
+ await startStatsAnalyzer({expected: {sendVideo: true}});
393
+ await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
867
394
 
868
- assert(loggerSpy.calledWith('StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received'));
395
+ statsAnalyzer.compareLastStatsResult();
396
+ assert.deepEqual(receivedEventsData.noFramesSent, undefined);
869
397
  });
870
398
 
871
- it('does not log a message when audio receive packets increase', async () => {
872
- await startStatsAnalyzer({expected: {receiveAudio: true}});
399
+ it('emits NO_FRAMES_ENCODED when frames are not being encoded for share', async () => {
400
+ const expected = {mediaType: 'share'};
401
+ await startStatsAnalyzer({expected: {sendShare: true}});
873
402
 
874
- fakeStats.audio.receivers[0].report[0].packetsReceived += 5;
875
- await progressTime();
403
+ statsAnalyzer.lastStatsResults.share.send = {framesEncoded: 102, totalPacketsSent: 106};
876
404
 
877
- assert(loggerSpy.neverCalledWith('StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received'));
878
- });
879
-
880
- it('logs a message when video send packets do not increase', async () => {
881
- await startStatsAnalyzer({expected: {sendVideo: true}});
882
-
883
- // don't increase the packets when time progresses.
884
- await progressTime();
405
+ await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
885
406
 
886
- assert(loggerSpy.calledWith('StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent'));
407
+ statsAnalyzer.compareLastStatsResult();
408
+ assert.deepEqual(receivedEventsData.noVideoEncoded, expected);
887
409
  });
888
410
 
889
- it('does not log a message when video send packets increase', async () => {
890
- await startStatsAnalyzer({expected: {sendVideo: true}});
891
-
892
- fakeStats.video.senders[0].report[0].packetsSent += 5;
893
- await progressTime();
894
-
895
- assert(loggerSpy.neverCalledWith('StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent'));
896
- });
411
+ it('emits NO_FRAMES_SENT when frames are not being sent but frames are being encoded for share', async () => {
412
+ const expected = {mediaType: 'share'};
413
+ await startStatsAnalyzer({expected: {sendShare: true}});
897
414
 
898
- it('logs a message when video receive packets do not increase', async () => {
899
- await startStatsAnalyzer({expected: {receiveVideo: true}});
415
+ statsAnalyzer.lastStatsResults.share.send = {
416
+ framesEncoded: 10,
417
+ framesSent: 105,
418
+ totalPacketsSent: 106,
419
+ };
900
420
 
901
- // don't increase the packets when time progresses.
902
- await progressTime();
421
+ await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
903
422
 
904
- assert(loggerSpy.calledWith('StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received'));
423
+ statsAnalyzer.compareLastStatsResult();
424
+ assert.deepEqual(receivedEventsData.noFramesSent, expected);
905
425
  });
906
426
 
907
- it('does not log a message when video receive packets increase', async () => {
908
- await startStatsAnalyzer({expected: {receiveVideo: true}});
427
+ it('doesnot emits NO_FRAMES_SENT when last emitted event is LOCAL_MEDIA_STOPPED for share', async () => {
428
+ statsAnalyzer.lastEmittedStartStopEvent.video.local = EVENTS.LOCAL_MEDIA_STOPPED;
909
429
 
910
- fakeStats.video.receivers[0].report[0].packetsReceived += 5;
911
- await progressTime();
430
+ await startStatsAnalyzer({expected: {sendShare: true}});
431
+ await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
912
432
 
913
- assert(loggerSpy.neverCalledWith('StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received'));
433
+ statsAnalyzer.compareLastStatsResult();
434
+ assert.deepEqual(receivedEventsData.noFramesSent, undefined);
914
435
  });
915
436
  });
916
437
  });