@webex/plugin-meetings 3.0.0-beta.29 → 3.0.0-beta.290

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 (373) 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 +94 -15
  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 +709 -35
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/utils.js +45 -1
  17. package/dist/breakouts/utils.js.map +1 -1
  18. package/dist/common/errors/no-meeting-info.js +51 -0
  19. package/dist/common/errors/no-meeting-info.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +28 -7
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/logs/request.js +5 -1
  25. package/dist/common/logs/request.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 +206 -29
  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 +61 -116
  61. package/dist/media/index.js.map +1 -1
  62. package/dist/media/properties.js +73 -124
  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 +3576 -2946
  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 +402 -98
  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 +58 -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 +132 -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 +326 -232
  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 +84 -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/utils.d.ts +14 -0
  158. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  159. package/dist/types/common/errors/webex-errors.d.ts +13 -1
  160. package/dist/types/common/logs/request.d.ts +2 -0
  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 +162 -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 +413 -508
  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 +90 -12
  186. package/dist/types/meetings/meetings.types.d.ts +4 -0
  187. package/dist/types/member/index.d.ts +14 -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 +25 -0
  193. package/dist/types/members/util.d.ts +214 -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 +7 -1
  213. package/dist/types/webinar/collection.d.ts +16 -0
  214. package/dist/types/webinar/index.d.ts +5 -0
  215. package/dist/webinar/collection.js +44 -0
  216. package/dist/webinar/collection.js.map +1 -0
  217. package/dist/webinar/index.js +69 -0
  218. package/dist/webinar/index.js.map +1 -0
  219. package/package.json +23 -20
  220. package/src/annotation/annotation.types.ts +50 -0
  221. package/src/annotation/constants.ts +36 -0
  222. package/src/annotation/index.ts +328 -0
  223. package/src/breakouts/README.md +42 -12
  224. package/src/breakouts/breakout.ts +67 -9
  225. package/src/breakouts/edit-lock-error.ts +25 -0
  226. package/src/breakouts/events.ts +56 -0
  227. package/src/breakouts/index.ts +592 -20
  228. package/src/breakouts/utils.ts +42 -0
  229. package/src/common/errors/no-meeting-info.ts +24 -0
  230. package/src/common/errors/webex-errors.ts +27 -2
  231. package/src/common/logs/logger-proxy.ts +1 -1
  232. package/src/common/logs/request.ts +5 -1
  233. package/src/common/queue.ts +22 -8
  234. package/src/config.ts +4 -9
  235. package/src/constants.ts +185 -18
  236. package/src/controls-options-manager/enums.ts +12 -0
  237. package/src/controls-options-manager/index.ts +116 -21
  238. package/src/controls-options-manager/types.ts +59 -0
  239. package/src/controls-options-manager/util.ts +294 -14
  240. package/src/index.ts +40 -0
  241. package/src/interpretation/README.md +60 -0
  242. package/src/interpretation/collection.ts +19 -0
  243. package/src/interpretation/index.ts +332 -0
  244. package/src/interpretation/siLanguage.ts +18 -0
  245. package/src/locus-info/controlsUtils.ts +108 -0
  246. package/src/locus-info/index.ts +413 -59
  247. package/src/locus-info/infoUtils.ts +10 -2
  248. package/src/locus-info/mediaSharesUtils.ts +64 -0
  249. package/src/locus-info/parser.ts +258 -47
  250. package/src/locus-info/selfUtils.ts +81 -5
  251. package/src/media/index.ts +102 -122
  252. package/src/media/properties.ts +87 -110
  253. package/src/meeting/in-meeting-actions.ts +163 -3
  254. package/src/meeting/index.ts +2858 -2462
  255. package/src/meeting/locusMediaRequest.ts +313 -0
  256. package/src/meeting/muteState.ts +229 -131
  257. package/src/meeting/request.ts +172 -121
  258. package/src/meeting/util.ts +588 -394
  259. package/src/meeting-info/index.ts +81 -8
  260. package/src/meeting-info/meeting-info-v2.ts +170 -14
  261. package/src/meeting-info/util.ts +1 -1
  262. package/src/meeting-info/utilv2.ts +23 -23
  263. package/src/meetings/collection.ts +20 -0
  264. package/src/meetings/index.ts +434 -108
  265. package/src/meetings/meetings.types.ts +12 -0
  266. package/src/meetings/request.ts +2 -0
  267. package/src/meetings/util.ts +79 -4
  268. package/src/member/index.ts +58 -0
  269. package/src/member/types.ts +38 -0
  270. package/src/member/util.ts +141 -25
  271. package/src/members/collection.ts +8 -0
  272. package/src/members/index.ts +106 -7
  273. package/src/members/request.ts +97 -17
  274. package/src/members/types.ts +29 -0
  275. package/src/members/util.ts +333 -240
  276. package/src/metrics/constants.ts +11 -4
  277. package/src/metrics/index.ts +1 -490
  278. package/src/multistream/mediaRequestManager.ts +289 -79
  279. package/src/multistream/receiveSlot.ts +47 -17
  280. package/src/multistream/receiveSlotManager.ts +34 -24
  281. package/src/multistream/remoteMedia.ts +27 -2
  282. package/src/multistream/remoteMediaGroup.ts +59 -0
  283. package/src/multistream/remoteMediaManager.ts +148 -30
  284. package/src/multistream/sendSlotManager.ts +170 -0
  285. package/src/reachability/index.ts +228 -37
  286. package/src/reachability/request.ts +17 -8
  287. package/src/reconnection-manager/index.ts +81 -54
  288. package/src/recording-controller/index.ts +20 -3
  289. package/src/recording-controller/util.ts +26 -9
  290. package/src/roap/index.ts +23 -30
  291. package/src/roap/request.ts +100 -104
  292. package/src/roap/turnDiscovery.ts +51 -25
  293. package/src/rtcMetrics/constants.ts +3 -0
  294. package/src/rtcMetrics/index.ts +100 -0
  295. package/src/statsAnalyzer/index.ts +103 -87
  296. package/src/statsAnalyzer/mqaUtil.ts +13 -14
  297. package/src/webinar/collection.ts +31 -0
  298. package/src/webinar/index.ts +62 -0
  299. package/test/integration/spec/converged-space-meetings.js +60 -3
  300. package/test/integration/spec/journey.js +320 -261
  301. package/test/integration/spec/space-meeting.js +76 -3
  302. package/test/unit/spec/annotation/index.ts +418 -0
  303. package/test/unit/spec/breakouts/breakout.ts +118 -28
  304. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  305. package/test/unit/spec/breakouts/events.ts +89 -0
  306. package/test/unit/spec/breakouts/index.ts +1395 -69
  307. package/test/unit/spec/breakouts/utils.js +52 -1
  308. package/test/unit/spec/common/queue.js +31 -2
  309. package/test/unit/spec/controls-options-manager/index.js +163 -0
  310. package/test/unit/spec/controls-options-manager/util.js +576 -60
  311. package/test/unit/spec/fixture/locus.js +1 -0
  312. package/test/unit/spec/interpretation/collection.ts +15 -0
  313. package/test/unit/spec/interpretation/index.ts +589 -0
  314. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  315. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  316. package/test/unit/spec/locus-info/index.js +1304 -33
  317. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  318. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  319. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  320. package/test/unit/spec/locus-info/parser.js +116 -35
  321. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  322. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  323. package/test/unit/spec/media/index.ts +104 -37
  324. package/test/unit/spec/media/properties.ts +2 -2
  325. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  326. package/test/unit/spec/meeting/index.js +4721 -1930
  327. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  328. package/test/unit/spec/meeting/muteState.js +408 -208
  329. package/test/unit/spec/meeting/request.js +440 -45
  330. package/test/unit/spec/meeting/utils.js +679 -64
  331. package/test/unit/spec/meeting-info/index.js +295 -0
  332. package/test/unit/spec/meeting-info/meetinginfov2.js +521 -5
  333. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  334. package/test/unit/spec/meetings/collection.js +14 -0
  335. package/test/unit/spec/meetings/index.js +1011 -177
  336. package/test/unit/spec/meetings/utils.js +206 -2
  337. package/test/unit/spec/member/index.js +61 -6
  338. package/test/unit/spec/member/util.js +510 -34
  339. package/test/unit/spec/members/index.js +319 -1
  340. package/test/unit/spec/members/request.js +206 -27
  341. package/test/unit/spec/members/utils.js +210 -0
  342. package/test/unit/spec/metrics/index.js +1 -50
  343. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  344. package/test/unit/spec/multistream/receiveSlot.ts +43 -20
  345. package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
  346. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  347. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  348. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  349. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  350. package/test/unit/spec/reachability/index.ts +549 -9
  351. package/test/unit/spec/reachability/request.js +68 -0
  352. package/test/unit/spec/reconnection-manager/index.js +84 -9
  353. package/test/unit/spec/recording-controller/index.js +294 -218
  354. package/test/unit/spec/recording-controller/util.js +223 -96
  355. package/test/unit/spec/roap/index.ts +31 -51
  356. package/test/unit/spec/roap/request.ts +203 -85
  357. package/test/unit/spec/roap/turnDiscovery.ts +48 -13
  358. package/test/unit/spec/rtcMetrics/index.ts +73 -0
  359. package/test/unit/spec/stats-analyzer/index.js +112 -2
  360. package/test/unit/spec/webinar/collection.ts +13 -0
  361. package/test/unit/spec/webinar/index.ts +60 -0
  362. package/test/utils/integrationTestUtils.js +46 -0
  363. package/test/utils/testUtils.js +0 -52
  364. package/dist/meeting/effectsState.js +0 -262
  365. package/dist/meeting/effectsState.js.map +0 -1
  366. package/dist/metrics/config.js +0 -299
  367. package/dist/metrics/config.js.map +0 -1
  368. package/dist/types/meeting/effectsState.d.ts +0 -42
  369. package/dist/types/metrics/config.d.ts +0 -178
  370. package/src/index.js +0 -16
  371. package/src/meeting/effectsState.ts +0 -211
  372. package/src/metrics/config.ts +0 -495
  373. package/test/unit/spec/meeting/effectsState.js +0 -285
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "3.0.0-beta.29",
3
+ "version": "3.0.0-beta.290",
4
4
  "description": "",
5
5
  "license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
6
6
  "contributors": [
@@ -32,31 +32,33 @@
32
32
  "build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
33
33
  },
34
34
  "devDependencies": {
35
- "@webex/plugin-meetings": "3.0.0-beta.29",
36
- "@webex/test-helper-chai": "3.0.0-beta.29",
37
- "@webex/test-helper-mocha": "3.0.0-beta.29",
38
- "@webex/test-helper-mock-webex": "3.0.0-beta.29",
39
- "@webex/test-helper-retry": "3.0.0-beta.29",
40
- "@webex/test-helper-test-users": "3.0.0-beta.29",
35
+ "@webex/plugin-meetings": "3.0.0-beta.290",
36
+ "@webex/test-helper-chai": "3.0.0-beta.290",
37
+ "@webex/test-helper-mocha": "3.0.0-beta.290",
38
+ "@webex/test-helper-mock-webex": "3.0.0-beta.290",
39
+ "@webex/test-helper-retry": "3.0.0-beta.290",
40
+ "@webex/test-helper-test-users": "3.0.0-beta.290",
41
41
  "chai": "^4.3.4",
42
42
  "chai-as-promised": "^7.1.1",
43
43
  "jsdom-global": "3.0.2",
44
44
  "sinon": "^9.2.4",
45
- "typed-emitter": "^2.1.0"
45
+ "typed-emitter": "^2.1.0",
46
+ "typescript": "^4.7.4"
46
47
  },
47
48
  "dependencies": {
48
- "@webex/common": "3.0.0-beta.29",
49
- "@webex/internal-media-core": "1.33.2",
50
- "@webex/internal-plugin-conversation": "3.0.0-beta.29",
51
- "@webex/internal-plugin-device": "3.0.0-beta.29",
52
- "@webex/internal-plugin-llm": "3.0.0-beta.29",
53
- "@webex/internal-plugin-mercury": "3.0.0-beta.29",
54
- "@webex/internal-plugin-metrics": "3.0.0-beta.29",
55
- "@webex/internal-plugin-support": "3.0.0-beta.29",
56
- "@webex/internal-plugin-user": "3.0.0-beta.29",
57
- "@webex/plugin-people": "3.0.0-beta.29",
58
- "@webex/plugin-rooms": "3.0.0-beta.29",
59
- "@webex/webex-core": "3.0.0-beta.29",
49
+ "@webex/common": "3.0.0-beta.290",
50
+ "@webex/internal-media-core": "2.1.0",
51
+ "@webex/internal-plugin-conversation": "3.0.0-beta.290",
52
+ "@webex/internal-plugin-device": "3.0.0-beta.290",
53
+ "@webex/internal-plugin-llm": "3.0.0-beta.290",
54
+ "@webex/internal-plugin-mercury": "3.0.0-beta.290",
55
+ "@webex/internal-plugin-metrics": "3.0.0-beta.290",
56
+ "@webex/internal-plugin-support": "3.0.0-beta.290",
57
+ "@webex/internal-plugin-user": "3.0.0-beta.290",
58
+ "@webex/media-helpers": "3.0.0-beta.290",
59
+ "@webex/plugin-people": "3.0.0-beta.290",
60
+ "@webex/plugin-rooms": "3.0.0-beta.290",
61
+ "@webex/webex-core": "3.0.0-beta.290",
60
62
  "ampersand-collection": "^2.0.2",
61
63
  "bowser": "^2.11.0",
62
64
  "btoa": "^1.2.1",
@@ -64,6 +66,7 @@
64
66
  "global": "^4.4.0",
65
67
  "ip-anonymize": "^0.1.0",
66
68
  "javascript-state-machine": "^3.1.0",
69
+ "jsonwebtoken": "^8.5.1",
67
70
  "lodash": "^4.17.21",
68
71
  "sdp-transform": "^2.12.0",
69
72
  "uuid": "^3.3.2",
@@ -0,0 +1,50 @@
1
+ import {ANNOTATION_POLICY} from './constants';
2
+
3
+ /**
4
+ * Type for an StrokeData Object
5
+ */
6
+ type StrokeData = {
7
+ deviceId: string;
8
+ toUserId: string;
9
+ requesterId: string;
10
+ content: string;
11
+ shareInstanceId: string;
12
+ encryptionKeyUrl: string;
13
+ version: string;
14
+ };
15
+
16
+ type RequestData = {
17
+ toUserId: string;
18
+ toDeviceUrl: string;
19
+ shareInstanceId: string;
20
+ };
21
+
22
+ type CommandRequestBody = {
23
+ actionType: string;
24
+ resourceType: string;
25
+ shareInstanceId: string;
26
+ receivers?: any[];
27
+ };
28
+ /**
29
+ * Type for an annotation Object include annotation version and privilege
30
+ */
31
+ type AnnotationInfo = {
32
+ version: string;
33
+ policy: ANNOTATION_POLICY;
34
+ };
35
+
36
+ interface IAnnotationChannel {
37
+ // === below is for presenter
38
+ acceptRequest: (approval) => undefined | Promise<void>;
39
+ declineRequest: (approval) => undefined | Promise<void>;
40
+ closeAnnotation: (requestData: RequestData) => undefined | Promise<void>;
41
+ // === below is for attendee
42
+ approveAnnotation: (requestData: RequestData) => undefined | Promise<void>;
43
+ cancelApproveAnnotation: (requestData: RequestData, approval) => undefined | Promise<void>;
44
+ sendStrokeData: (strokeData: StrokeData) => void;
45
+ // =====
46
+ approvalUrlUpdate: (approvalUrl: string) => void;
47
+ locusUrlUpdate: (locusUrl: string) => void;
48
+ }
49
+
50
+ export type {StrokeData, RequestData, CommandRequestBody, IAnnotationChannel, AnnotationInfo};
@@ -0,0 +1,36 @@
1
+ export const EVENT_TRIGGERS = {
2
+ ANNOTATION_STROKE_DATA: 'annotation:strokeData',
3
+ ANNOTATION_COMMAND: 'annotation:command',
4
+ };
5
+ export const ANNOTATION_RESOURCE_TYPE = 'AnnotationOnShare';
6
+ export const ANNOTATION_RELAY_TYPES = {
7
+ ANNOTATION_CLIENT: 'annotation.client',
8
+ };
9
+
10
+ export const ANNOTATION_STATUS = {
11
+ NO_ANNOTATION: 'NO_ANNOTATION',
12
+ RUNNING_ANNOTATION: 'RUNNING_ANNOTATION',
13
+ };
14
+
15
+ export enum ANNOTATION_POLICY {
16
+ ANYONE_CAN_ANNOTATE = 'AnyoneCanAnnotate',
17
+ APPROVAL = 'Approval',
18
+ ANNOTATION_NOT_ALLOWED = 'AnnotationNotAllowed',
19
+ }
20
+
21
+ export const ANNOTATION_REQUEST_TYPE = {
22
+ ANNOTATION_MESSAGE: 'annotation_message',
23
+ };
24
+
25
+ export const enum ANNOTATION_ACTION_TYPE {
26
+ REQUESTED = 'REQUESTED',
27
+ ACCEPTED = 'ACCEPTED',
28
+ DECLINED = 'DECLINED',
29
+ OFFERED = 'OFFERED',
30
+ CANCELED = 'CANCELED',
31
+ EXPIRED = 'EXPIRED',
32
+ REVOKED = 'REVOKED',
33
+ CLOSED = 'CLOSED',
34
+ }
35
+
36
+ export const ANNOTATION = 'annotation';
@@ -0,0 +1,328 @@
1
+ import uuid from 'uuid';
2
+ // eslint-disable-next-line import/no-extraneous-dependencies
3
+ import {WebexPlugin, config} from '@webex/webex-core';
4
+ import TriggerProxy from '../common/events/trigger-proxy';
5
+
6
+ import {
7
+ EVENT_TRIGGERS,
8
+ ANNOTATION_RELAY_TYPES,
9
+ ANNOTATION,
10
+ ANNOTATION_REQUEST_TYPE,
11
+ ANNOTATION_ACTION_TYPE,
12
+ ANNOTATION_RESOURCE_TYPE,
13
+ } from './constants';
14
+
15
+ import {StrokeData, RequestData, IAnnotationChannel, CommandRequestBody} from './annotation.types';
16
+ import {HTTP_VERBS} from '../constants';
17
+
18
+ /**
19
+ * @description Annotation to handle LLM and Mercury message and locus API
20
+ * @class
21
+ */
22
+ class AnnotationChannel extends WebexPlugin implements IAnnotationChannel {
23
+ namespace = ANNOTATION;
24
+
25
+ private seqNum: number;
26
+
27
+ hasSubscribedToEvents: boolean;
28
+
29
+ approvalUrl: string;
30
+ locusUrl: string;
31
+ deviceUrl: string;
32
+
33
+ /**
34
+ * Initializes annotation module
35
+ */
36
+ constructor(...args) {
37
+ super(...args);
38
+ this.seqNum = 1;
39
+ }
40
+
41
+ /**
42
+ * Process Stroke Data
43
+ * @param {object} data
44
+ * @returns {void}
45
+ */
46
+ private processStrokeMessage(data) {
47
+ const {request} = data;
48
+ this.decryptContent(request.value.encryptionKeyUrl, request.value.content).then(
49
+ (decryptedContent) => {
50
+ request.value.content = decryptedContent;
51
+ TriggerProxy.trigger(
52
+ this,
53
+ {
54
+ file: 'annotation',
55
+ function: 'processStrokeMessage',
56
+ },
57
+ EVENT_TRIGGERS.ANNOTATION_STROKE_DATA,
58
+ {
59
+ payload: data,
60
+ }
61
+ );
62
+ }
63
+ );
64
+ }
65
+
66
+ /** bind all events from mercury
67
+ * @param {Object} e
68
+ * @returns {undefined}
69
+ */
70
+ private eventCommandProcessor(e) {
71
+ if (
72
+ e?.data?.eventType === 'locus.approval_request' &&
73
+ e?.data?.approval?.resourceType === ANNOTATION_RESOURCE_TYPE &&
74
+ e?.data?.approval?.actionType
75
+ ) {
76
+ TriggerProxy.trigger(
77
+ this,
78
+ {
79
+ file: 'annotation',
80
+ function: 'approval_request',
81
+ },
82
+ EVENT_TRIGGERS.ANNOTATION_COMMAND,
83
+ {
84
+ type: e.data.approval.actionType,
85
+ payload: e.data.approval,
86
+ }
87
+ );
88
+ }
89
+ }
90
+
91
+ /** bind all events from llm
92
+ * @param {Object} e
93
+ * @returns {undefined}
94
+ */
95
+ private eventDataProcessor(e) {
96
+ switch (e?.data?.relayType) {
97
+ case ANNOTATION_RELAY_TYPES.ANNOTATION_CLIENT:
98
+ this.processStrokeMessage(e.data);
99
+ break;
100
+ default:
101
+ break;
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Listen to websocket messages
107
+ * @returns {undefined}
108
+ */
109
+ private listenToEvents() {
110
+ if (!this.hasSubscribedToEvents) {
111
+ // @ts-ignore
112
+ this.webex.internal.mercury.on(
113
+ 'event:locus.approval_request',
114
+ this.eventCommandProcessor,
115
+ this
116
+ );
117
+ // @ts-ignore
118
+ this.webex.internal.llm.on('event:relay.event', this.eventDataProcessor, this);
119
+ this.hasSubscribedToEvents = true;
120
+ }
121
+ }
122
+
123
+ /**
124
+ * set locusUrl
125
+ * @param {string} locusUrl
126
+ * @returns {void}
127
+ */
128
+ public locusUrlUpdate(locusUrl: string) {
129
+ this.locusUrl = locusUrl;
130
+ this.listenToEvents();
131
+ }
132
+
133
+ /**
134
+ * set approved url
135
+ * @param {string} approvalUrl
136
+ * @returns {void}
137
+ */
138
+ public approvalUrlUpdate(approvalUrl: string) {
139
+ this.approvalUrl = approvalUrl;
140
+ }
141
+
142
+ /**
143
+ * accept request
144
+ * @param {object} approval
145
+ * @returns {Promise}
146
+ */
147
+ public acceptRequest(approval) {
148
+ // @ts-ignore
149
+ return this.request({
150
+ method: HTTP_VERBS.PUT,
151
+ url: approval.url,
152
+ body: {
153
+ resourceType: ANNOTATION_RESOURCE_TYPE,
154
+ actionType: ANNOTATION_ACTION_TYPE.ACCEPTED,
155
+ },
156
+ });
157
+ }
158
+
159
+ /**
160
+ * presenter declined request annotation
161
+ * @param {approval} approval
162
+ * @returns {Promise}
163
+ */
164
+ public declineRequest(approval) {
165
+ // @ts-ignore
166
+ return this.request({
167
+ method: HTTP_VERBS.PUT,
168
+ url: approval.url,
169
+ body: {
170
+ resourceType: ANNOTATION_RESOURCE_TYPE,
171
+ actionType: ANNOTATION_ACTION_TYPE.DECLINED,
172
+ },
173
+ });
174
+ }
175
+
176
+ /**
177
+ * request approved annotation
178
+ * @param {RequestData} requestData
179
+ * @returns {Promise}
180
+ */
181
+ public approveAnnotation(requestData: RequestData) {
182
+ return this.sendAnnotationAction(ANNOTATION_ACTION_TYPE.REQUESTED, requestData);
183
+ }
184
+
185
+ /**
186
+ * cancel approved annotation
187
+ * @param {object} requestData
188
+ * @param {object} approval
189
+ * @returns {Promise}
190
+ */
191
+ public cancelApproveAnnotation(requestData: RequestData, approval) {
192
+ const body: CommandRequestBody = {
193
+ actionType: ANNOTATION_ACTION_TYPE.CANCELED,
194
+ resourceType: 'AnnotationOnShare',
195
+ shareInstanceId: requestData.shareInstanceId,
196
+ };
197
+
198
+ // @ts-ignore
199
+ return this.request({
200
+ method: HTTP_VERBS.PUT,
201
+ url: `${approval.url}`,
202
+ body,
203
+ });
204
+ }
205
+
206
+ /**
207
+ * close annotation
208
+ * @param {object} requestData
209
+ * @returns {Promise}
210
+ */
211
+ public closeAnnotation(requestData: RequestData) {
212
+ return this.sendAnnotationAction(ANNOTATION_ACTION_TYPE.CLOSED, requestData);
213
+ }
214
+
215
+ /**
216
+ * send annotation command
217
+ * @param {ANNOTATION_ACTION_TYPE} actionType
218
+ * @param {RequestData} requestData
219
+ * @returns {Promise}
220
+ */
221
+ private sendAnnotationAction = async (
222
+ actionType: ANNOTATION_ACTION_TYPE,
223
+ requestData: RequestData
224
+ ): Promise<void> => {
225
+ const body: CommandRequestBody = {
226
+ actionType,
227
+ resourceType: 'AnnotationOnShare',
228
+ shareInstanceId: requestData.shareInstanceId,
229
+ };
230
+ if (requestData?.toUserId) {
231
+ body.receivers = [{participantId: requestData.toUserId, deviceUrl: requestData.toDeviceUrl}];
232
+ }
233
+
234
+ // @ts-ignore
235
+ return this.request({
236
+ method: HTTP_VERBS.POST,
237
+ url: `${this.approvalUrl}`,
238
+ body,
239
+ });
240
+ };
241
+
242
+ /**
243
+ * decrypt data
244
+ * @param {string} encryptionKeyUrl
245
+ * @param {string} content encrypted content
246
+ * @returns {string} decrypted content
247
+ */
248
+ private decryptContent = (encryptionKeyUrl: string, content: string): Promise<any> => {
249
+ // @ts-ignore
250
+ return this.webex.internal.encryption.decryptText(encryptionKeyUrl, content).then((res) => {
251
+ return res;
252
+ });
253
+ };
254
+
255
+ /**
256
+ * encrypt data
257
+ * @param {string} encryptionKeyUrl
258
+ * @param {string} content original content
259
+ * @returns {string} encrypted content
260
+ */
261
+ private encryptContent = (encryptionKeyUrl: string, content: string): Promise<any> => {
262
+ // @ts-ignore
263
+ return this.webex.internal.encryption.encryptText(encryptionKeyUrl, content).then((res) => {
264
+ return res;
265
+ });
266
+ };
267
+
268
+ /**
269
+ * Sends stroke data to presenter
270
+ * @param {StrokeData} strokeData
271
+ * @returns {void}
272
+ */
273
+ public sendStrokeData = (strokeData: StrokeData): void => {
274
+ // @ts-ignore
275
+ if (!this.webex.internal.llm.isConnected()) return;
276
+ this.encryptContent(strokeData.encryptionKeyUrl, strokeData.content).then(
277
+ (encryptedContent) => {
278
+ this.publishEncrypted(encryptedContent, strokeData);
279
+ }
280
+ );
281
+ };
282
+
283
+ /**
284
+ * private encrypted the strokes data
285
+ * @param {string} encryptedContent
286
+ * @param {StrokeData} strokeData
287
+ * @returns {void}
288
+ */
289
+ private publishEncrypted(encryptedContent: string, strokeData: StrokeData) {
290
+ const data = {
291
+ id: `${this.seqNum}`,
292
+ type: 'publishRequest',
293
+ recipients: {
294
+ // @ts-ignore
295
+ route: this.webex.internal.llm.getBinding(),
296
+ },
297
+ headers: {
298
+ to: strokeData.toUserId,
299
+ },
300
+ data: {
301
+ eventType: 'relay.event',
302
+ relayType: ANNOTATION_RELAY_TYPES.ANNOTATION_CLIENT,
303
+ request: {
304
+ value: {
305
+ type: ANNOTATION_REQUEST_TYPE.ANNOTATION_MESSAGE,
306
+ content: encryptedContent,
307
+ deviceId: strokeData.deviceId,
308
+ seq: this.seqNum,
309
+ requesterId: strokeData.requesterId,
310
+ version: strokeData.version,
311
+ shareInstanceId: strokeData.shareInstanceId,
312
+ encryptionKeyUrl: strokeData.encryptionKeyUrl,
313
+ },
314
+ },
315
+ },
316
+ trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,
317
+ timestamp: new Date().getTime(),
318
+ sequenceNumber: this.seqNum,
319
+ filterMessage: false,
320
+ };
321
+
322
+ // @ts-ignore
323
+ this.webex.internal.llm.socket.send(data);
324
+ this.seqNum += 1;
325
+ }
326
+ }
327
+
328
+ export default AnnotationChannel;
@@ -41,6 +41,12 @@ The following are methods available to attendees of a meeting:
41
41
  ```javascript
42
42
  // Join a breakout
43
43
  // This can be used when the participant is in the main session or in a different breakout session
44
+ // when call join function, should send message to metrics
45
+ /* Breakout Sessions created during meetings allow participants to move into smaller breakout sessions and then
46
+ return to the main meeting at a later time. These moves can be initiated by the user or by the meeting
47
+ host/co-host. The goal of this metric is to track these moves in production by instrumenting them for
48
+ analysis from the end user's experience perspective.
49
+ */
44
50
  breakout.join();
45
51
 
46
52
  // Leave a breakout
@@ -107,10 +113,6 @@ note: None of these are currently implemented
107
113
  // Move a participant to breakout
108
114
  breakout.move(participant)
109
115
 
110
- // Assign a particpant to a breakout
111
- // Not sure whether there is any difference from move
112
- breakout.assign(participant)
113
-
114
116
  // Remove someone from a breakout session
115
117
  // This returns them to the main session
116
118
  breakout.remove(participant)
@@ -119,21 +121,49 @@ breakout.remove(participant)
119
121
  // This can only be done when breakouts are inactive
120
122
  breakout.delete()
121
123
 
122
- // Create a breakout session
123
- breakouts.create(sessionName)
124
+ /*
125
+ Create breakout sessions, Type is array
126
+ Format: [{'name':'session1', "anyoneCanJoin" : true}]
127
+ */
128
+ breakouts.create(sessions)
129
+
130
+ // Delete all breakout sessions
131
+ breakouts.clearSessions()
132
+
133
+ // update breakout session with params
134
+ // if unlockEdit is true, will release lock editing after update finish
135
+ breakout.update(params, unlockEdit)
136
+
137
+ // Start breakout sessions with necessary params
138
+ breakouts.start(params)
124
139
 
125
- // Rename an existing breakout session
126
- breakout.rename(newSessionName)
140
+ // Assign a particpant/participants to breakouts/a breakout
141
+ // sessions should be like: [{id:'xx',memberIds:['111'],emails:['111@ss.com',anyone: true]},...]
142
+ breakouts.assign(sessions)
127
143
 
128
- // Start breakout sessions
129
- breakouts.start()
144
+ // Dynammic assign a particpant/participants to breakouts/main (not used by now)
145
+ // Admit lobby waiting participants to a breakout directly
146
+ // sessions should be like: [{id:'xx',participants:['111'],targetState:'JOINED'},...]
147
+ breakouts.dynamicAssign(sessions)
130
148
 
131
- // End breakout sessions
132
- breakouts.end()
149
+ // End breakout sessions with necessary params
150
+ breakouts.end(params)
151
+
152
+ // get breakout sessions with/without param editlock
153
+ breakouts.getBreakout(editlock?)
133
154
 
134
155
  // Enable breakout sessions
135
156
  breakouts.enable()
136
157
 
158
+ // Enable and lock breakout
159
+ breakouts.enableAndLockBreakout()
160
+
161
+ // Lock breakout
162
+ breakouts.lockBreakout()
163
+
164
+ // Unlock breakout
165
+ breakouts.unLockEditBreakout()
166
+
137
167
  // Disable breakout sessions
138
168
  breakouts.disable()
139
169
 
@@ -4,11 +4,11 @@
4
4
 
5
5
  import {WebexPlugin} from '@webex/webex-core';
6
6
 
7
- import {HTTP_VERBS, MEETINGS} from '../constants';
8
- import LocusInfo from '../locus-info';
7
+ import uuid from 'uuid';
8
+ import {_ID_, HTTP_VERBS, MEETINGS} from '../constants';
9
9
  import Members from '../members';
10
10
  import BreakoutRequest from './request';
11
-
11
+ import breakoutEvent from './events';
12
12
  /**
13
13
  * @class
14
14
  */
@@ -30,10 +30,12 @@ const Breakout = WebexPlugin.extend({
30
30
  sessionType: 'string',
31
31
  groupId: 'string',
32
32
  url: 'string', // where to send requests to
33
+ requestedLastModifiedTime: 'string',
33
34
  },
34
35
 
35
36
  derived: {
36
37
  isMain: {
38
+ cache: false, // fix issue: sometimes the derived will not change even if the deps changed
37
39
  deps: ['sessionType'],
38
40
  /**
39
41
  * If the breakout has no name, assume it is the main session
@@ -44,26 +46,47 @@ const Breakout = WebexPlugin.extend({
44
46
  },
45
47
  },
46
48
  },
47
-
49
+ /**
50
+ * initializer for the Breakout class
51
+ * @returns {void}
52
+ */
48
53
  initialize() {
49
- this.members = new Members({}, {parent: this.webex});
50
54
  // @ts-ignore
51
55
  this.breakoutRequest = new BreakoutRequest({webex: this.webex});
56
+ this.breakoutRosterLocus = null;
52
57
  },
53
58
 
54
59
  /**
55
60
  * Joins the breakout session
56
61
  * @returns {Promise}
57
62
  */
58
- join() {
59
- return this.request({
63
+ async join() {
64
+ const breakoutMoveId = uuid.v4();
65
+ const deviceUrl = this.webex.internal.device.url;
66
+ const {meetingId} = this.collection.parent;
67
+ const meeting = this.webex.meetings.getMeetingByType(_ID_, meetingId);
68
+ breakoutEvent.onBreakoutMoveRequest(
69
+ {currentSession: this, meeting, breakoutMoveId},
70
+ // @ts-ignore
71
+ this.webex.internal.newMetrics.submitClientEvent.bind(this.webex.internal.newMetrics)
72
+ );
73
+ const result = await this.request({
60
74
  method: HTTP_VERBS.POST,
61
75
  uri: `${this.url}/move`,
62
76
  body: {
77
+ breakoutMoveId,
78
+ deviceUrl,
63
79
  groupId: this.groupId,
64
80
  sessionId: this.sessionId,
65
81
  },
66
82
  });
83
+ breakoutEvent.onBreakoutMoveResponse(
84
+ {currentSession: this, meeting, breakoutMoveId},
85
+ // @ts-ignore
86
+ this.webex.internal.newMetrics.submitClientEvent.bind(this.webex.internal.newMetrics)
87
+ );
88
+
89
+ return result;
67
90
  },
68
91
 
69
92
  /**
@@ -101,12 +124,47 @@ const Breakout = WebexPlugin.extend({
101
124
  },
102
125
 
103
126
  /**
104
- * Parses the participants from the locus object
105
- * @param locus Locus object
127
+ * inits the members object
106
128
  * @returns {void}
107
129
  */
130
+ initMembers() {
131
+ const {meetingId} = this.collection.parent;
132
+ const meeting = this.webex.meetings.getMeetingByType(_ID_, meetingId);
133
+ this.members = new Members(
134
+ {
135
+ meeting,
136
+ },
137
+ {parent: this.webex}
138
+ );
139
+ },
108
140
 
141
+ /**
142
+ * check sequence and determine whether to update the new roster or not
143
+ * @param {Object} locus Locus object
144
+ * @returns {Boolean}
145
+ */
146
+ isNeedHandleRoster(locus: any) {
147
+ if (!this.breakoutRosterLocus?.sequence?.entries?.length || !locus?.sequence?.entries?.length) {
148
+ return true;
149
+ }
150
+ const prevSequence = this.breakoutRosterLocus.sequence.entries[0];
151
+ const currentSequence = locus.sequence.entries[0];
152
+
153
+ return currentSequence > prevSequence;
154
+ },
155
+ /**
156
+ * Parses the participants from the locus object
157
+ * @param {Object} locus Locus object
158
+ * @returns {void}
159
+ */
109
160
  parseRoster(locus) {
161
+ if (!this.members) {
162
+ this.initMembers();
163
+ }
164
+ if (!this.isNeedHandleRoster(locus)) {
165
+ return;
166
+ }
167
+ this.breakoutRosterLocus = locus;
110
168
  this.members.locusParticipantsUpdate(locus);
111
169
  },
112
170