@webex/plugin-meetings 3.0.0-beta.28 → 3.0.0-beta.280

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 (363) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +114 -14
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +763 -31
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/no-meeting-info.js +51 -0
  21. package/dist/common/errors/no-meeting-info.js.map +1 -0
  22. package/dist/common/errors/webex-errors.js +28 -7
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/logs/logger-proxy.js +1 -1
  25. package/dist/common/logs/logger-proxy.js.map +1 -1
  26. package/dist/common/queue.js +24 -9
  27. package/dist/common/queue.js.map +1 -1
  28. package/dist/config.js +5 -10
  29. package/dist/config.js.map +1 -1
  30. package/dist/constants.js +203 -28
  31. package/dist/constants.js.map +1 -1
  32. package/dist/controls-options-manager/enums.js +14 -2
  33. package/dist/controls-options-manager/enums.js.map +1 -1
  34. package/dist/controls-options-manager/index.js +109 -15
  35. package/dist/controls-options-manager/index.js.map +1 -1
  36. package/dist/controls-options-manager/types.js +7 -0
  37. package/dist/controls-options-manager/types.js.map +1 -0
  38. package/dist/controls-options-manager/util.js +309 -18
  39. package/dist/controls-options-manager/util.js.map +1 -1
  40. package/dist/index.js +112 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/interpretation/collection.js +23 -0
  43. package/dist/interpretation/collection.js.map +1 -0
  44. package/dist/interpretation/index.js +366 -0
  45. package/dist/interpretation/index.js.map +1 -0
  46. package/dist/interpretation/siLanguage.js +25 -0
  47. package/dist/interpretation/siLanguage.js.map +1 -0
  48. package/dist/locus-info/controlsUtils.js +91 -2
  49. package/dist/locus-info/controlsUtils.js.map +1 -1
  50. package/dist/locus-info/index.js +383 -62
  51. package/dist/locus-info/index.js.map +1 -1
  52. package/dist/locus-info/infoUtils.js +7 -1
  53. package/dist/locus-info/infoUtils.js.map +1 -1
  54. package/dist/locus-info/mediaSharesUtils.js +57 -1
  55. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  56. package/dist/locus-info/parser.js +249 -72
  57. package/dist/locus-info/parser.js.map +1 -1
  58. package/dist/locus-info/selfUtils.js +89 -14
  59. package/dist/locus-info/selfUtils.js.map +1 -1
  60. package/dist/media/index.js +58 -116
  61. package/dist/media/index.js.map +1 -1
  62. package/dist/media/properties.js +72 -123
  63. package/dist/media/properties.js.map +1 -1
  64. package/dist/meeting/in-meeting-actions.js +82 -2
  65. package/dist/meeting/in-meeting-actions.js.map +1 -1
  66. package/dist/meeting/index.js +3123 -2814
  67. package/dist/meeting/index.js.map +1 -1
  68. package/dist/meeting/locusMediaRequest.js +292 -0
  69. package/dist/meeting/locusMediaRequest.js.map +1 -0
  70. package/dist/meeting/muteState.js +230 -124
  71. package/dist/meeting/muteState.js.map +1 -1
  72. package/dist/meeting/request.js +256 -196
  73. package/dist/meeting/request.js.map +1 -1
  74. package/dist/meeting/util.js +601 -417
  75. package/dist/meeting/util.js.map +1 -1
  76. package/dist/meeting-info/index.js +73 -7
  77. package/dist/meeting-info/index.js.map +1 -1
  78. package/dist/meeting-info/meeting-info-v2.js +192 -51
  79. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  80. package/dist/meeting-info/util.js +1 -1
  81. package/dist/meeting-info/util.js.map +1 -1
  82. package/dist/meeting-info/utilv2.js +36 -36
  83. package/dist/meeting-info/utilv2.js.map +1 -1
  84. package/dist/meetings/collection.js +22 -0
  85. package/dist/meetings/collection.js.map +1 -1
  86. package/dist/meetings/index.js +394 -94
  87. package/dist/meetings/index.js.map +1 -1
  88. package/dist/meetings/meetings.types.js +7 -0
  89. package/dist/meetings/meetings.types.js.map +1 -0
  90. package/dist/meetings/request.js +2 -0
  91. package/dist/meetings/request.js.map +1 -1
  92. package/dist/meetings/util.js +71 -1
  93. package/dist/meetings/util.js.map +1 -1
  94. package/dist/member/index.js +49 -0
  95. package/dist/member/index.js.map +1 -1
  96. package/dist/member/types.js +25 -0
  97. package/dist/member/types.js.map +1 -0
  98. package/dist/member/util.js +121 -25
  99. package/dist/member/util.js.map +1 -1
  100. package/dist/members/collection.js +10 -0
  101. package/dist/members/collection.js.map +1 -1
  102. package/dist/members/index.js +86 -6
  103. package/dist/members/index.js.map +1 -1
  104. package/dist/members/request.js +106 -38
  105. package/dist/members/request.js.map +1 -1
  106. package/dist/members/types.js +15 -0
  107. package/dist/members/types.js.map +1 -0
  108. package/dist/members/util.js +316 -233
  109. package/dist/members/util.js.map +1 -1
  110. package/dist/metrics/constants.js +12 -5
  111. package/dist/metrics/constants.js.map +1 -1
  112. package/dist/metrics/index.js +1 -468
  113. package/dist/metrics/index.js.map +1 -1
  114. package/dist/multistream/mediaRequestManager.js +238 -49
  115. package/dist/multistream/mediaRequestManager.js.map +1 -1
  116. package/dist/multistream/receiveSlot.js +40 -16
  117. package/dist/multistream/receiveSlot.js.map +1 -1
  118. package/dist/multistream/receiveSlotManager.js +39 -36
  119. package/dist/multistream/receiveSlotManager.js.map +1 -1
  120. package/dist/multistream/remoteMedia.js +44 -18
  121. package/dist/multistream/remoteMedia.js.map +1 -1
  122. package/dist/multistream/remoteMediaGroup.js +60 -3
  123. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  124. package/dist/multistream/remoteMediaManager.js +209 -59
  125. package/dist/multistream/remoteMediaManager.js.map +1 -1
  126. package/dist/multistream/sendSlotManager.js +233 -0
  127. package/dist/multistream/sendSlotManager.js.map +1 -0
  128. package/dist/reachability/index.js +225 -59
  129. package/dist/reachability/index.js.map +1 -1
  130. package/dist/reachability/request.js +17 -8
  131. package/dist/reachability/request.js.map +1 -1
  132. package/dist/reconnection-manager/index.js +199 -154
  133. package/dist/reconnection-manager/index.js.map +1 -1
  134. package/dist/recording-controller/index.js +21 -2
  135. package/dist/recording-controller/index.js.map +1 -1
  136. package/dist/recording-controller/util.js +9 -8
  137. package/dist/recording-controller/util.js.map +1 -1
  138. package/dist/roap/index.js +23 -29
  139. package/dist/roap/index.js.map +1 -1
  140. package/dist/roap/request.js +112 -97
  141. package/dist/roap/request.js.map +1 -1
  142. package/dist/roap/turnDiscovery.js +96 -36
  143. package/dist/roap/turnDiscovery.js.map +1 -1
  144. package/dist/rtcMetrics/constants.js +12 -0
  145. package/dist/rtcMetrics/constants.js.map +1 -0
  146. package/dist/rtcMetrics/index.js +117 -0
  147. package/dist/rtcMetrics/index.js.map +1 -0
  148. package/dist/statsAnalyzer/index.js +67 -73
  149. package/dist/statsAnalyzer/index.js.map +1 -1
  150. package/dist/statsAnalyzer/mqaUtil.js +11 -10
  151. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  152. package/dist/types/annotation/annotation.types.d.ts +42 -0
  153. package/dist/types/annotation/constants.d.ts +31 -0
  154. package/dist/types/annotation/index.d.ts +117 -0
  155. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  156. package/dist/types/breakouts/events.d.ts +8 -0
  157. package/dist/types/breakouts/request.d.ts +22 -0
  158. package/dist/types/breakouts/utils.d.ts +15 -0
  159. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  160. package/dist/types/common/errors/webex-errors.d.ts +13 -1
  161. package/dist/types/common/queue.d.ts +9 -7
  162. package/dist/types/config.d.ts +1 -6
  163. package/dist/types/constants.d.ts +161 -21
  164. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  165. package/dist/types/controls-options-manager/index.d.ts +17 -1
  166. package/dist/types/controls-options-manager/types.d.ts +43 -0
  167. package/dist/types/controls-options-manager/util.d.ts +1 -7
  168. package/dist/types/index.d.ts +6 -4
  169. package/dist/types/interpretation/collection.d.ts +5 -0
  170. package/dist/types/interpretation/index.d.ts +5 -0
  171. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  172. package/dist/types/locus-info/index.d.ts +57 -4
  173. package/dist/types/locus-info/parser.d.ts +67 -6
  174. package/dist/types/media/index.d.ts +2 -0
  175. package/dist/types/media/properties.d.ts +34 -48
  176. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  177. package/dist/types/meeting/index.d.ts +345 -507
  178. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  179. package/dist/types/meeting/muteState.d.ts +99 -23
  180. package/dist/types/meeting/request.d.ts +72 -43
  181. package/dist/types/meeting/util.d.ts +101 -1
  182. package/dist/types/meeting-info/index.d.ts +13 -1
  183. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  184. package/dist/types/meetings/collection.d.ts +8 -0
  185. package/dist/types/meetings/index.d.ts +88 -12
  186. package/dist/types/meetings/meetings.types.d.ts +4 -0
  187. package/dist/types/member/index.d.ts +13 -0
  188. package/dist/types/member/types.d.ts +32 -0
  189. package/dist/types/members/collection.d.ts +5 -0
  190. package/dist/types/members/index.d.ts +35 -2
  191. package/dist/types/members/request.d.ts +73 -9
  192. package/dist/types/members/types.d.ts +24 -0
  193. package/dist/types/members/util.d.ts +209 -1
  194. package/dist/types/metrics/constants.d.ts +11 -4
  195. package/dist/types/metrics/index.d.ts +4 -119
  196. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  197. package/dist/types/multistream/receiveSlot.d.ts +13 -11
  198. package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
  199. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  200. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  201. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  202. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  203. package/dist/types/reachability/index.d.ts +61 -7
  204. package/dist/types/reachability/request.d.ts +7 -3
  205. package/dist/types/reconnection-manager/index.d.ts +9 -0
  206. package/dist/types/recording-controller/index.d.ts +15 -1
  207. package/dist/types/recording-controller/util.d.ts +5 -4
  208. package/dist/types/roap/request.d.ts +15 -11
  209. package/dist/types/roap/turnDiscovery.d.ts +18 -1
  210. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  211. package/dist/types/rtcMetrics/index.d.ts +47 -0
  212. package/dist/types/statsAnalyzer/index.d.ts +6 -1
  213. package/package.json +23 -20
  214. package/src/annotation/annotation.types.ts +50 -0
  215. package/src/annotation/constants.ts +36 -0
  216. package/src/annotation/index.ts +328 -0
  217. package/src/breakouts/README.md +44 -14
  218. package/src/breakouts/breakout.ts +87 -9
  219. package/src/breakouts/edit-lock-error.ts +25 -0
  220. package/src/breakouts/events.ts +56 -0
  221. package/src/breakouts/index.ts +646 -18
  222. package/src/breakouts/request.ts +55 -0
  223. package/src/breakouts/utils.ts +57 -0
  224. package/src/common/errors/no-meeting-info.ts +24 -0
  225. package/src/common/errors/webex-errors.ts +27 -2
  226. package/src/common/logs/logger-proxy.ts +1 -1
  227. package/src/common/queue.ts +22 -8
  228. package/src/config.ts +4 -9
  229. package/src/constants.ts +184 -18
  230. package/src/controls-options-manager/enums.ts +12 -0
  231. package/src/controls-options-manager/index.ts +116 -21
  232. package/src/controls-options-manager/types.ts +59 -0
  233. package/src/controls-options-manager/util.ts +294 -14
  234. package/src/index.ts +40 -0
  235. package/src/interpretation/README.md +60 -0
  236. package/src/interpretation/collection.ts +19 -0
  237. package/src/interpretation/index.ts +332 -0
  238. package/src/interpretation/siLanguage.ts +18 -0
  239. package/src/locus-info/controlsUtils.ts +108 -0
  240. package/src/locus-info/index.ts +413 -59
  241. package/src/locus-info/infoUtils.ts +10 -2
  242. package/src/locus-info/mediaSharesUtils.ts +64 -0
  243. package/src/locus-info/parser.ts +258 -47
  244. package/src/locus-info/selfUtils.ts +81 -5
  245. package/src/media/index.ts +100 -122
  246. package/src/media/properties.ts +85 -108
  247. package/src/meeting/in-meeting-actions.ts +163 -3
  248. package/src/meeting/index.ts +2541 -2309
  249. package/src/meeting/locusMediaRequest.ts +313 -0
  250. package/src/meeting/muteState.ts +229 -131
  251. package/src/meeting/request.ts +172 -121
  252. package/src/meeting/util.ts +588 -394
  253. package/src/meeting-info/index.ts +81 -8
  254. package/src/meeting-info/meeting-info-v2.ts +170 -14
  255. package/src/meeting-info/util.ts +1 -1
  256. package/src/meeting-info/utilv2.ts +23 -23
  257. package/src/meetings/collection.ts +20 -0
  258. package/src/meetings/index.ts +428 -108
  259. package/src/meetings/meetings.types.ts +12 -0
  260. package/src/meetings/request.ts +2 -0
  261. package/src/meetings/util.ts +79 -4
  262. package/src/member/index.ts +49 -0
  263. package/src/member/types.ts +38 -0
  264. package/src/member/util.ts +127 -25
  265. package/src/members/collection.ts +8 -0
  266. package/src/members/index.ts +106 -7
  267. package/src/members/request.ts +97 -17
  268. package/src/members/types.ts +28 -0
  269. package/src/members/util.ts +319 -240
  270. package/src/metrics/constants.ts +11 -4
  271. package/src/metrics/index.ts +1 -490
  272. package/src/multistream/mediaRequestManager.ts +289 -79
  273. package/src/multistream/receiveSlot.ts +47 -17
  274. package/src/multistream/receiveSlotManager.ts +34 -24
  275. package/src/multistream/remoteMedia.ts +27 -2
  276. package/src/multistream/remoteMediaGroup.ts +59 -0
  277. package/src/multistream/remoteMediaManager.ts +148 -30
  278. package/src/multistream/sendSlotManager.ts +170 -0
  279. package/src/reachability/index.ts +228 -37
  280. package/src/reachability/request.ts +17 -8
  281. package/src/reconnection-manager/index.ts +81 -54
  282. package/src/recording-controller/index.ts +20 -3
  283. package/src/recording-controller/util.ts +26 -9
  284. package/src/roap/index.ts +23 -30
  285. package/src/roap/request.ts +100 -104
  286. package/src/roap/turnDiscovery.ts +51 -25
  287. package/src/rtcMetrics/constants.ts +3 -0
  288. package/src/rtcMetrics/index.ts +100 -0
  289. package/src/statsAnalyzer/index.ts +88 -88
  290. package/src/statsAnalyzer/mqaUtil.ts +13 -14
  291. package/test/integration/spec/converged-space-meetings.js +60 -3
  292. package/test/integration/spec/journey.js +320 -261
  293. package/test/integration/spec/space-meeting.js +76 -3
  294. package/test/unit/spec/annotation/index.ts +418 -0
  295. package/test/unit/spec/breakouts/breakout.ts +142 -24
  296. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  297. package/test/unit/spec/breakouts/events.ts +89 -0
  298. package/test/unit/spec/breakouts/index.ts +1488 -67
  299. package/test/unit/spec/breakouts/request.ts +104 -0
  300. package/test/unit/spec/breakouts/utils.js +72 -0
  301. package/test/unit/spec/common/queue.js +31 -2
  302. package/test/unit/spec/controls-options-manager/index.js +163 -0
  303. package/test/unit/spec/controls-options-manager/util.js +576 -60
  304. package/test/unit/spec/fixture/locus.js +1 -0
  305. package/test/unit/spec/interpretation/collection.ts +15 -0
  306. package/test/unit/spec/interpretation/index.ts +589 -0
  307. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  308. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  309. package/test/unit/spec/locus-info/index.js +1304 -33
  310. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  311. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  312. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  313. package/test/unit/spec/locus-info/parser.js +116 -35
  314. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  315. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  316. package/test/unit/spec/media/index.ts +104 -37
  317. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  318. package/test/unit/spec/meeting/index.js +4515 -1932
  319. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  320. package/test/unit/spec/meeting/muteState.js +408 -208
  321. package/test/unit/spec/meeting/request.js +440 -45
  322. package/test/unit/spec/meeting/utils.js +679 -64
  323. package/test/unit/spec/meeting-info/index.js +295 -0
  324. package/test/unit/spec/meeting-info/meetinginfov2.js +521 -5
  325. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  326. package/test/unit/spec/meetings/collection.js +14 -0
  327. package/test/unit/spec/meetings/index.js +1007 -177
  328. package/test/unit/spec/meetings/utils.js +206 -2
  329. package/test/unit/spec/member/index.js +58 -4
  330. package/test/unit/spec/member/util.js +479 -35
  331. package/test/unit/spec/members/index.js +319 -1
  332. package/test/unit/spec/members/request.js +206 -27
  333. package/test/unit/spec/members/utils.js +184 -0
  334. package/test/unit/spec/metrics/index.js +1 -50
  335. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  336. package/test/unit/spec/multistream/receiveSlot.ts +43 -20
  337. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  338. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  339. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  340. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  341. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  342. package/test/unit/spec/reachability/index.ts +549 -9
  343. package/test/unit/spec/reachability/request.js +68 -0
  344. package/test/unit/spec/reconnection-manager/index.js +84 -9
  345. package/test/unit/spec/recording-controller/index.js +294 -218
  346. package/test/unit/spec/recording-controller/util.js +223 -96
  347. package/test/unit/spec/roap/index.ts +31 -51
  348. package/test/unit/spec/roap/request.ts +203 -85
  349. package/test/unit/spec/roap/turnDiscovery.ts +48 -13
  350. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  351. package/test/unit/spec/stats-analyzer/index.js +64 -2
  352. package/test/utils/integrationTestUtils.js +46 -0
  353. package/test/utils/testUtils.js +0 -52
  354. package/dist/meeting/effectsState.js +0 -262
  355. package/dist/meeting/effectsState.js.map +0 -1
  356. package/dist/metrics/config.js +0 -299
  357. package/dist/metrics/config.js.map +0 -1
  358. package/dist/types/meeting/effectsState.d.ts +0 -42
  359. package/dist/types/metrics/config.d.ts +0 -178
  360. package/src/index.js +0 -16
  361. package/src/meeting/effectsState.ts +0 -211
  362. package/src/metrics/config.ts +0 -495
  363. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -28,6 +28,7 @@ import {
28
28
  getVideoSenderMqa,
29
29
  getVideoReceiverMqa,
30
30
  } from './mqaUtil';
31
+ import {ReceiveSlot} from '../multistream/receiveSlot';
31
32
 
32
33
  export const EVENTS = {
33
34
  MEDIA_QUALITY: 'MEDIA_QUALITY',
@@ -53,6 +54,8 @@ const emptyReceiver = {
53
54
  meanRoundTripTime: [],
54
55
  };
55
56
 
57
+ type ReceiveSlotCallback = (csi: number) => ReceiveSlot | undefined;
58
+
56
59
  /**
57
60
  * Stats Analyzer class that will emit events based on detected quality
58
61
  *
@@ -74,17 +77,20 @@ export class StatsAnalyzer extends EventsScope {
74
77
  statsInterval: NodeJS.Timeout;
75
78
  statsResults: any;
76
79
  statsStarted: any;
80
+ receiveSlotCallback: ReceiveSlotCallback;
77
81
 
78
82
  /**
79
83
  * Creates a new instance of StatsAnalyzer
80
84
  * @constructor
81
85
  * @public
82
86
  * @param {Object} config SDK Configuration Object
87
+ * @param {Function} receiveSlotCallback Callback used to access receive slots.
83
88
  * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
84
89
  * @param {Object} statsResults Default properties for stats
85
90
  */
86
91
  constructor(
87
92
  config: any,
93
+ receiveSlotCallback: ReceiveSlotCallback = () => undefined,
88
94
  networkQualityMonitor: object = {},
89
95
  statsResults: object = defaultStats
90
96
  ) {
@@ -98,6 +104,7 @@ export class StatsAnalyzer extends EventsScope {
98
104
  this.mqaSentCount = -1;
99
105
  this.lastMqaDataSent = {};
100
106
  this.lastEmittedStartStopEvent = {};
107
+ this.receiveSlotCallback = receiveSlotCallback;
101
108
  }
102
109
 
103
110
  /**
@@ -186,7 +193,7 @@ export class StatsAnalyzer extends EventsScope {
186
193
  }
187
194
  });
188
195
 
189
- newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];
196
+ newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
190
197
 
191
198
  // Adding peripheral information
192
199
  newMqa.intervalMetadata.peripherals = [];
@@ -293,7 +300,6 @@ export class StatsAnalyzer extends EventsScope {
293
300
  this.mediaConnection = null;
294
301
  });
295
302
  }
296
- this.mediaConnection = null;
297
303
 
298
304
  return Promise.resolve();
299
305
  }
@@ -492,23 +498,23 @@ export class StatsAnalyzer extends EventsScope {
492
498
  const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>
493
499
  Object.keys(this.statsResults)
494
500
  .filter((key) => key.startsWith(keyPrefix))
495
- .reduce((prev, cur) => prev + (this.statsResults[cur].recv[value] || 0), 0);
501
+ .reduce((prev, cur) => prev + (this.statsResults[cur]?.recv[value] || 0), 0);
496
502
 
497
503
  const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>
498
504
  Object.keys(this.statsResults)
499
505
  .filter((key) => key.startsWith(keyPrefix))
500
- .reduce((prev, cur) => prev + (this.lastStatsResults[cur].recv[value] || 0), 0);
506
+ .reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);
501
507
 
502
508
  const getCurrentResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
503
509
  Object.keys(this.statsResults)
504
510
  .filter((key) => key.startsWith(keyPrefix))
505
- .reduce((prev, cur) => prev + (this.statsResults.resolutions[cur].recv[value] || 0), 0);
511
+ .reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]?.recv[value] || 0), 0);
506
512
 
507
513
  const getPreviousResolutionsStatsTotals = (keyPrefix: string, value: string): number =>
508
514
  Object.keys(this.statsResults)
509
515
  .filter((key) => key.startsWith(keyPrefix))
510
516
  .reduce(
511
- (prev, cur) => prev + (this.lastStatsResults.resolutions[cur].recv[value] || 0),
517
+ (prev, cur) => prev + (this.lastStatsResults.resolutions[cur]?.recv[value] || 0),
512
518
  0
513
519
  );
514
520
 
@@ -523,7 +529,8 @@ export class StatsAnalyzer extends EventsScope {
523
529
  currentStats.totalPacketsSent === 0
524
530
  ) {
525
531
  LoggerProxy.logger.info(
526
- `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`
532
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,
533
+ currentStats.totalPacketsSent
527
534
  );
528
535
  } else {
529
536
  if (
@@ -531,7 +538,8 @@ export class StatsAnalyzer extends EventsScope {
531
538
  currentStats.totalAudioEnergy === 0
532
539
  ) {
533
540
  LoggerProxy.logger.info(
534
- `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`
541
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,
542
+ currentStats.totalAudioEnergy
535
543
  );
536
544
  }
537
545
 
@@ -565,14 +573,16 @@ export class StatsAnalyzer extends EventsScope {
565
573
 
566
574
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
567
575
  LoggerProxy.logger.info(
568
- `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`
576
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`,
577
+ currentPacketsReceived
569
578
  );
570
579
  } else if (
571
580
  currentSamplesReceived === previousSamplesReceived ||
572
581
  currentSamplesReceived === 0
573
582
  ) {
574
583
  LoggerProxy.logger.info(
575
- `StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`
584
+ `StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`,
585
+ currentSamplesReceived
576
586
  );
577
587
  }
578
588
 
@@ -589,7 +599,8 @@ export class StatsAnalyzer extends EventsScope {
589
599
  currentStats.totalPacketsSent === 0
590
600
  ) {
591
601
  LoggerProxy.logger.info(
592
- `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`
602
+ `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,
603
+ currentStats.totalPacketsSent
593
604
  );
594
605
  } else {
595
606
  if (
@@ -597,7 +608,8 @@ export class StatsAnalyzer extends EventsScope {
597
608
  currentStats.framesEncoded === 0
598
609
  ) {
599
610
  LoggerProxy.logger.info(
600
- `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`
611
+ `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,
612
+ currentStats.framesEncoded
601
613
  );
602
614
  }
603
615
 
@@ -607,7 +619,8 @@ export class StatsAnalyzer extends EventsScope {
607
619
  this.statsResults.resolutions['video-send'].send.framesSent === 0
608
620
  ) {
609
621
  LoggerProxy.logger.info(
610
- `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`
622
+ `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,
623
+ this.statsResults.resolutions['video-send'].send.framesSent
611
624
  );
612
625
  }
613
626
  }
@@ -643,24 +656,28 @@ export class StatsAnalyzer extends EventsScope {
643
656
 
644
657
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
645
658
  LoggerProxy.logger.info(
646
- `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`
659
+ `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`,
660
+ currentPacketsReceived
647
661
  );
648
662
  } else {
649
663
  if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
650
664
  LoggerProxy.logger.info(
651
- `StatsAnalyzer:index#compareLastStatsResult --> No video frames received`
665
+ `StatsAnalyzer:index#compareLastStatsResult --> No video frames received`,
666
+ currentFramesReceived
652
667
  );
653
668
  }
654
669
 
655
670
  if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
656
671
  LoggerProxy.logger.info(
657
- `StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`
672
+ `StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`,
673
+ currentFramesDecoded
658
674
  );
659
675
  }
660
676
 
661
677
  if (currentFramesDropped - previousFramesDropped > 10) {
662
678
  LoggerProxy.logger.info(
663
- `StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`
679
+ `StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`,
680
+ currentFramesDropped - previousFramesDropped
664
681
  );
665
682
  }
666
683
  }
@@ -679,7 +696,8 @@ export class StatsAnalyzer extends EventsScope {
679
696
  currentStats.totalPacketsSent === 0
680
697
  ) {
681
698
  LoggerProxy.logger.info(
682
- `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`
699
+ `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,
700
+ currentStats.totalPacketsSent
683
701
  );
684
702
  } else {
685
703
  if (
@@ -687,7 +705,8 @@ export class StatsAnalyzer extends EventsScope {
687
705
  currentStats.framesEncoded === 0
688
706
  ) {
689
707
  LoggerProxy.logger.info(
690
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`
708
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,
709
+ currentStats.framesEncoded
691
710
  );
692
711
  }
693
712
 
@@ -697,7 +716,8 @@ export class StatsAnalyzer extends EventsScope {
697
716
  this.statsResults.resolutions['video-share-send'].send.framesSent === 0
698
717
  ) {
699
718
  LoggerProxy.logger.info(
700
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`
719
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,
720
+ this.statsResults.resolutions['video-share-send'].send.framesSent
701
721
  );
702
722
  }
703
723
  }
@@ -735,24 +755,28 @@ export class StatsAnalyzer extends EventsScope {
735
755
 
736
756
  if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
737
757
  LoggerProxy.logger.info(
738
- `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`
758
+ `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`,
759
+ currentPacketsReceived
739
760
  );
740
761
  } else {
741
762
  if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
742
763
  LoggerProxy.logger.info(
743
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames received`
764
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames received`,
765
+ currentFramesReceived
744
766
  );
745
767
  }
746
768
 
747
769
  if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
748
770
  LoggerProxy.logger.info(
749
- `StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`
771
+ `StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`,
772
+ currentFramesDecoded
750
773
  );
751
774
  }
752
775
 
753
776
  if (currentFramesDropped - previousFramesDropped > 10) {
754
777
  LoggerProxy.logger.info(
755
- `StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`
778
+ `StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`,
779
+ currentFramesDropped - previousFramesDropped
756
780
  );
757
781
  }
758
782
  }
@@ -853,6 +877,14 @@ export class StatsAnalyzer extends EventsScope {
853
877
  if (result.bytesSent) {
854
878
  let kilobytes = 0;
855
879
 
880
+ if (result.frameWidth && result.frameHeight) {
881
+ this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
882
+ this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
883
+ this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
884
+ this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent =
885
+ result.hugeFramesSent;
886
+ }
887
+
856
888
  if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
857
889
  this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
858
890
  }
@@ -925,6 +957,17 @@ export class StatsAnalyzer extends EventsScope {
925
957
 
926
958
  if (result.bytesReceived) {
927
959
  let kilobytes = 0;
960
+ const receiveSlot = this.receiveSlotCallback(result.ssrc);
961
+ const idAndCsi = receiveSlot
962
+ ? `id: "${receiveSlot.id || ''}"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`
963
+ : '';
964
+
965
+ if (result.frameWidth && result.frameHeight) {
966
+ this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
967
+ this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
968
+ this.statsResults.resolutions[mediaType][sendrecvType].framesReceived =
969
+ result.framesReceived;
970
+ }
928
971
 
929
972
  if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
930
973
  this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
@@ -974,10 +1017,12 @@ export class StatsAnalyzer extends EventsScope {
974
1017
  result.packetsReceived;
975
1018
 
976
1019
  if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
977
- LoggerProxy.logger.info(
978
- `StatsAnalyzer:index#processInboundRTPResult --> No packets received for ${mediaType} `,
979
- this.statsResults[mediaType][sendrecvType].packetsReceived
980
- );
1020
+ if (receiveSlot) {
1021
+ LoggerProxy.logger.info(
1022
+ `StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}`,
1023
+ this.statsResults[mediaType][sendrecvType].packetsReceived
1024
+ );
1025
+ }
981
1026
  }
982
1027
 
983
1028
  // Check the over all packet Lost ratio
@@ -989,7 +1034,7 @@ export class StatsAnalyzer extends EventsScope {
989
1034
  : 0;
990
1035
  if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
991
1036
  LoggerProxy.logger.info(
992
- 'StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ',
1037
+ `StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,
993
1038
  this.statsResults[mediaType][sendrecvType].currentPacketLossRatio
994
1039
  );
995
1040
  }
@@ -1049,73 +1094,35 @@ export class StatsAnalyzer extends EventsScope {
1049
1094
  if (!result || !result.id) {
1050
1095
  return;
1051
1096
  }
1052
- const RemoteCandidateType = {};
1053
- const RemoteTransport = {};
1054
- const RemoteIpAddress = {};
1055
- const RemoteNetworkType = {};
1056
1097
 
1057
- if (!result.id) return;
1098
+ let transport;
1099
+ if (result.relayProtocol) {
1100
+ transport = result.relayProtocol.toUpperCase();
1101
+ } else if (result.protocol) {
1102
+ transport = result.protocol.toUpperCase();
1103
+ }
1058
1104
 
1059
1105
  const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;
1060
1106
  const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;
1061
1107
 
1062
- if (!RemoteCandidateType[result.id]) {
1063
- RemoteCandidateType[result.id] = [];
1064
- }
1065
-
1066
- if (!RemoteTransport[result.id]) {
1067
- RemoteTransport[result.id] = [];
1068
- }
1069
-
1070
- if (!RemoteIpAddress[result.id]) {
1071
- RemoteIpAddress[result.id] = [];
1072
- }
1073
- if (!RemoteNetworkType[result.id]) {
1074
- RemoteNetworkType[result.id] = [];
1075
- }
1076
-
1077
- if (
1078
- result.candidateType &&
1079
- RemoteCandidateType[result.id].indexOf(result.candidateType) === -1
1080
- ) {
1081
- RemoteCandidateType[result.id].push(result.candidateType);
1082
- }
1083
-
1084
- if (result.protocol && RemoteTransport[result.id].indexOf(result.protocol) === -1) {
1085
- RemoteTransport[result.id].push(result.protocol.toUpperCase());
1086
- }
1087
-
1088
- if (
1089
- result.ip &&
1090
- RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1
1091
- ) {
1092
- RemoteIpAddress[result.id].push(`${result.ip}`); // TODO: Add ports
1093
- }
1094
-
1095
- if (result.networkType && RemoteNetworkType[result.id].indexOf(result.networkType) === -1) {
1096
- RemoteNetworkType[result.id].push(result.networkType);
1097
- }
1098
-
1099
1108
  this.statsResults.internal.candidates[result.id] = {
1100
- candidateType: RemoteCandidateType[result.id],
1101
- ipAddress: RemoteIpAddress[result.id],
1109
+ candidateType: result.candidateType,
1110
+ ipAddress: result.ip, // TODO: add ports
1102
1111
  portNumber: result.port,
1103
- networkType: RemoteNetworkType[result.id],
1112
+ networkType: result.networkType,
1104
1113
  priority: result.priority,
1105
- transport: RemoteTransport[result.id],
1114
+ transport,
1106
1115
  timestamp: result.time,
1107
1116
  id: result.id,
1108
1117
  type: result.type,
1109
1118
  };
1110
1119
 
1111
- this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];
1112
- this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];
1120
+ this.statsResults.connectionType[ipType].candidateType = result.candidateType;
1121
+ this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;
1113
1122
 
1114
1123
  this.statsResults.connectionType[ipType].networkType =
1115
- RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN
1116
- ? NETWORK_TYPE.UNKNOWN
1117
- : RemoteNetworkType[result.id][0];
1118
- this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
1124
+ result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;
1125
+ this.statsResults.connectionType[ipType].transport = transport;
1119
1126
 
1120
1127
  this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
1121
1128
  };
@@ -1137,13 +1144,6 @@ export class StatsAnalyzer extends EventsScope {
1137
1144
  const sendrecvType =
1138
1145
  result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
1139
1146
 
1140
- if (result.frameWidth && result.frameHeight) {
1141
- this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
1142
- this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
1143
- this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
1144
- this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
1145
- }
1146
-
1147
1147
  if (sendrecvType === STATS.RECEIVE_DIRECTION) {
1148
1148
  this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
1149
1149
  this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
@@ -23,7 +23,7 @@ export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSen
23
23
  }
24
24
 
25
25
  audioReceiver.common.common.direction = statsResults[mediaType].direction;
26
- audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
26
+ audioReceiver.common.transportType = statsResults.connectionType.local.transport;
27
27
 
28
28
  // add rtpPacket info inside common as also for call analyzer
29
29
  audioReceiver.common.rtpPackets =
@@ -83,7 +83,7 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, m
83
83
  }
84
84
 
85
85
  audioSender.common.common.direction = statsResults[mediaType].direction;
86
- audioSender.common.transportType = statsResults.connectionType.local.transport[0];
86
+ audioSender.common.transportType = statsResults.connectionType.local.transport;
87
87
 
88
88
  audioSender.common.maxRemoteJitter =
89
89
  // @ts-ignore
@@ -146,7 +146,8 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
146
146
  }
147
147
 
148
148
  videoReceiver.common.common.direction = statsResults[mediaType].direction;
149
- videoReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
149
+ videoReceiver.common.transportType = statsResults.connectionType.local.transport;
150
+
150
151
  // collect the packets received for the last min
151
152
  videoReceiver.common.rtpPackets =
152
153
  statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
@@ -199,12 +200,11 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
199
200
  videoReceiver.streams[0].common.framesDropped =
200
201
  statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;
201
202
  videoReceiver.streams[0].receivedHeight =
202
- statsResults.resolutions[mediaType][sendrecvType].height;
203
- videoReceiver.streams[0].receivedWidth = statsResults.resolutions[mediaType][sendrecvType].width;
203
+ statsResults.resolutions[mediaType][sendrecvType].height || 0;
204
+ videoReceiver.streams[0].receivedWidth =
205
+ statsResults.resolutions[mediaType][sendrecvType].width || 0;
204
206
  videoReceiver.streams[0].receivedFrameSize =
205
- (statsResults.resolutions[mediaType][sendrecvType].height *
206
- statsResults.resolutions[mediaType][sendrecvType].height) /
207
- 256;
207
+ (videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;
208
208
 
209
209
  videoReceiver.streams[0].receivedKeyFrames =
210
210
  statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;
@@ -229,7 +229,7 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
229
229
  }
230
230
 
231
231
  videoSender.common.common.direction = statsResults[mediaType].direction;
232
- videoSender.common.transportType = statsResults.connectionType.local.transport[0];
232
+ videoSender.common.transportType = statsResults.connectionType.local.transport;
233
233
 
234
234
  // @ts-ignore
235
235
  videoSender.common.maxRemoteJitter =
@@ -284,10 +284,9 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
284
284
  ? (totalFrameSentInaMin * 100) / 60
285
285
  : 0;
286
286
  videoSender.streams[0].transmittedHeight =
287
- statsResults.resolutions[mediaType][sendrecvType].height;
288
- videoSender.streams[0].transmittedWidth = statsResults.resolutions[mediaType][sendrecvType].width;
287
+ statsResults.resolutions[mediaType][sendrecvType].height || 0;
288
+ videoSender.streams[0].transmittedWidth =
289
+ statsResults.resolutions[mediaType][sendrecvType].width || 0;
289
290
  videoSender.streams[0].transmittedFrameSize =
290
- (statsResults.resolutions[mediaType][sendrecvType].height *
291
- statsResults.resolutions[mediaType][sendrecvType].width) /
292
- 254;
291
+ (videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;
293
292
  };
@@ -3,13 +3,30 @@ import 'jsdom-global/register';
3
3
  import {assert} from '@webex/test-helper-chai';
4
4
  import {skipInNode} from '@webex/test-helper-mocha';
5
5
  import BrowserDetection from '@webex/plugin-meetings/dist/common/browser-detection';
6
+ import {createCameraStream, createMicrophoneStream} from '@webex/plugin-meetings';
6
7
 
7
8
  import {MEDIA_SERVERS} from '../../utils/constants';
8
9
  import testUtils from '../../utils/testUtils';
10
+ import integrationTestUtils from '../../utils/integrationTestUtils';
9
11
  import webexTestUsers from '../../utils/webex-test-users';
10
12
 
11
13
  config();
12
14
 
15
+ const localTracks = {
16
+ alice: {
17
+ microphone: undefined,
18
+ camera: undefined,
19
+ },
20
+ bob: {
21
+ microphone: undefined,
22
+ camera: undefined,
23
+ },
24
+ chris: {
25
+ microphone: undefined,
26
+ camera: undefined,
27
+ },
28
+ };
29
+
13
30
  skipInNode(describe)('plugin-meetings', () => {
14
31
  const {isBrowser} = BrowserDetection();
15
32
 
@@ -135,6 +152,17 @@ skipInNode(describe)('plugin-meetings', () => {
135
152
  assert.exists(chris.meeting.joinedWith);
136
153
  });
137
154
 
155
+ it('users "alice", "bob", and "chris" create local tracks', async () => {
156
+ localTracks.alice.microphone = await createMicrophoneStream();
157
+ localTracks.alice.camera = await createCameraStream();
158
+
159
+ localTracks.bob.microphone = await createMicrophoneStream();
160
+ localTracks.bob.camera = await createCameraStream();
161
+
162
+ localTracks.chris.microphone = await createMicrophoneStream();
163
+ localTracks.chris.camera = await createCameraStream();
164
+ });
165
+
138
166
  it('users "alice", "bob", and "chris" add media', async () => {
139
167
  mediaReadyListener = testUtils.waitForEvents([
140
168
  {scope: alice.meeting, event: 'media:negotiated'},
@@ -142,9 +170,9 @@ skipInNode(describe)('plugin-meetings', () => {
142
170
  {scope: chris.meeting, event: 'media:negotiated'},
143
171
  ]);
144
172
 
145
- const addMediaAlice = testUtils.addMedia(alice, {expectedMediaReadyTypes: ['local']});
146
- const addMediaBob = testUtils.addMedia(bob, {expectedMediaReadyTypes: ['local']});
147
- const addMediaChris = testUtils.addMedia(chris, {expectedMediaReadyTypes: ['local']});
173
+ const addMediaAlice = integrationTestUtils.addMedia(alice, {multistream: true, microphone: localTracks.alice.microphone, camera: localTracks.alice.camera});
174
+ const addMediaBob = integrationTestUtils.addMedia(bob, {multistream: true, microphone: localTracks.bob.microphone, camera: localTracks.bob.camera});
175
+ const addMediaChris = integrationTestUtils.addMedia(chris, {multistream: true, microphone: localTracks.chris.microphone, camera: localTracks.chris.camera});
148
176
 
149
177
  await addMediaAlice;
150
178
  await addMediaBob;
@@ -171,6 +199,35 @@ skipInNode(describe)('plugin-meetings', () => {
171
199
  assert.equal(bob.meeting.mediaProperties.webrtcMediaConnection.mediaServer, MEDIA_SERVERS.HOMER);
172
200
  assert.equal(chris.meeting.mediaProperties.webrtcMediaConnection.mediaServer, MEDIA_SERVERS.HOMER);
173
201
  });
202
+
203
+ it('users "alice", "bob", and "chris" stop their local tracks', () => {
204
+ if (localTracks.alice.microphone) {
205
+ localTracks.alice.microphone.stop();
206
+ localTracks.alice.microphone = undefined;
207
+ }
208
+ if (localTracks.alice.camera) {
209
+ localTracks.alice.camera.stop();
210
+ localTracks.alice.camera = undefined;
211
+ }
212
+
213
+ if (localTracks.bob.microphone) {
214
+ localTracks.bob.microphone.stop();
215
+ localTracks.bob.microphone = undefined;
216
+ }
217
+ if (localTracks.bob.camera) {
218
+ localTracks.bob.camera.stop();
219
+ localTracks.bob.camera = undefined;
220
+ }
221
+
222
+ if (localTracks.chris.microphone) {
223
+ localTracks.chris.microphone.stop();
224
+ localTracks.chris.microphone = undefined;
225
+ }
226
+ if (localTracks.chris.camera) {
227
+ localTracks.chris.camera.stop();
228
+ localTracks.chris.camera = undefined;
229
+ }
230
+ });
174
231
  });
175
232
  }
176
233
  });