@webex/plugin-meetings 3.0.0-beta.4 → 3.0.0-beta.400

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 (629) hide show
  1. package/README.md +58 -8
  2. package/UPGRADING.md +9 -9
  3. package/browsers.js +19 -24
  4. package/dist/annotation/annotation.types.js +7 -0
  5. package/dist/annotation/annotation.types.js.map +1 -0
  6. package/dist/annotation/constants.js +49 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.js +342 -0
  9. package/dist/annotation/index.js.map +1 -0
  10. package/dist/breakouts/breakout.js +216 -0
  11. package/dist/breakouts/breakout.js.map +1 -0
  12. package/dist/breakouts/collection.js +23 -0
  13. package/dist/breakouts/collection.js.map +1 -0
  14. package/dist/breakouts/edit-lock-error.js +52 -0
  15. package/dist/breakouts/edit-lock-error.js.map +1 -0
  16. package/dist/breakouts/events.js +45 -0
  17. package/dist/breakouts/events.js.map +1 -0
  18. package/dist/breakouts/index.js +1048 -0
  19. package/dist/breakouts/index.js.map +1 -0
  20. package/dist/breakouts/request.js +78 -0
  21. package/dist/breakouts/request.js.map +1 -0
  22. package/dist/breakouts/utils.js +67 -0
  23. package/dist/breakouts/utils.js.map +1 -0
  24. package/dist/common/browser-detection.js +1 -20
  25. package/dist/common/browser-detection.js.map +1 -1
  26. package/dist/common/collection.js +5 -20
  27. package/dist/common/collection.js.map +1 -1
  28. package/dist/common/config.js +0 -7
  29. package/dist/common/config.js.map +1 -1
  30. package/dist/common/errors/captcha-error.js +10 -24
  31. package/dist/common/errors/captcha-error.js.map +1 -1
  32. package/dist/common/errors/intent-to-join.js +11 -24
  33. package/dist/common/errors/intent-to-join.js.map +1 -1
  34. package/dist/common/errors/join-meeting.js +12 -25
  35. package/dist/common/errors/join-meeting.js.map +1 -1
  36. package/dist/common/errors/media.js +10 -24
  37. package/dist/common/errors/media.js.map +1 -1
  38. package/dist/common/errors/no-meeting-info.js +51 -0
  39. package/dist/common/errors/no-meeting-info.js.map +1 -0
  40. package/dist/common/errors/parameter.js +5 -33
  41. package/dist/common/errors/parameter.js.map +1 -1
  42. package/dist/common/errors/password-error.js +10 -24
  43. package/dist/common/errors/password-error.js.map +1 -1
  44. package/dist/common/errors/permission.js +9 -23
  45. package/dist/common/errors/permission.js.map +1 -1
  46. package/dist/common/errors/reclaim-host-role-errors.js +158 -0
  47. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  48. package/dist/common/errors/reconnection-in-progress.js +0 -17
  49. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  50. package/dist/common/errors/reconnection.js +10 -24
  51. package/dist/common/errors/reconnection.js.map +1 -1
  52. package/dist/common/errors/stats.js +10 -24
  53. package/dist/common/errors/stats.js.map +1 -1
  54. package/dist/common/errors/webex-errors.js +54 -48
  55. package/dist/common/errors/webex-errors.js.map +1 -1
  56. package/dist/common/errors/webex-meetings-error.js +5 -25
  57. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  58. package/dist/common/events/events-scope.js +0 -22
  59. package/dist/common/events/events-scope.js.map +1 -1
  60. package/dist/common/events/events.js +0 -23
  61. package/dist/common/events/events.js.map +1 -1
  62. package/dist/common/events/trigger-proxy.js +0 -12
  63. package/dist/common/events/trigger-proxy.js.map +1 -1
  64. package/dist/common/events/util.js +0 -15
  65. package/dist/common/events/util.js.map +1 -1
  66. package/dist/common/logs/logger-config.js +0 -4
  67. package/dist/common/logs/logger-config.js.map +1 -1
  68. package/dist/common/logs/logger-proxy.js +1 -8
  69. package/dist/common/logs/logger-proxy.js.map +1 -1
  70. package/dist/common/logs/request.js +41 -60
  71. package/dist/common/logs/request.js.map +1 -1
  72. package/dist/common/queue.js +28 -23
  73. package/dist/common/queue.js.map +1 -1
  74. package/dist/config.js +11 -15
  75. package/dist/config.js.map +1 -1
  76. package/dist/constants.js +347 -74
  77. package/dist/constants.js.map +1 -1
  78. package/dist/controls-options-manager/constants.js +14 -0
  79. package/dist/controls-options-manager/constants.js.map +1 -0
  80. package/dist/controls-options-manager/enums.js +27 -0
  81. package/dist/controls-options-manager/enums.js.map +1 -0
  82. package/dist/controls-options-manager/index.js +297 -0
  83. package/dist/controls-options-manager/index.js.map +1 -0
  84. package/dist/controls-options-manager/types.js +7 -0
  85. package/dist/controls-options-manager/types.js.map +1 -0
  86. package/dist/controls-options-manager/util.js +319 -0
  87. package/dist/controls-options-manager/util.js.map +1 -0
  88. package/dist/index.js +125 -18
  89. package/dist/index.js.map +1 -1
  90. package/dist/interceptors/index.js +15 -0
  91. package/dist/interceptors/index.js.map +1 -0
  92. package/dist/interceptors/locusRetry.js +93 -0
  93. package/dist/interceptors/locusRetry.js.map +1 -0
  94. package/dist/interpretation/collection.js +23 -0
  95. package/dist/interpretation/collection.js.map +1 -0
  96. package/dist/interpretation/index.js +380 -0
  97. package/dist/interpretation/index.js.map +1 -0
  98. package/dist/interpretation/siLanguage.js +25 -0
  99. package/dist/interpretation/siLanguage.js.map +1 -0
  100. package/dist/locus-info/controlsUtils.js +101 -29
  101. package/dist/locus-info/controlsUtils.js.map +1 -1
  102. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  103. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  104. package/dist/locus-info/fullState.js +0 -15
  105. package/dist/locus-info/fullState.js.map +1 -1
  106. package/dist/locus-info/hostUtils.js +4 -12
  107. package/dist/locus-info/hostUtils.js.map +1 -1
  108. package/dist/locus-info/index.js +564 -246
  109. package/dist/locus-info/index.js.map +1 -1
  110. package/dist/locus-info/infoUtils.js +10 -38
  111. package/dist/locus-info/infoUtils.js.map +1 -1
  112. package/dist/locus-info/mediaSharesUtils.js +82 -38
  113. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  114. package/dist/locus-info/parser.js +314 -163
  115. package/dist/locus-info/parser.js.map +1 -1
  116. package/dist/locus-info/selfUtils.js +110 -92
  117. package/dist/locus-info/selfUtils.js.map +1 -1
  118. package/dist/media/index.js +107 -231
  119. package/dist/media/index.js.map +1 -1
  120. package/dist/media/properties.js +137 -222
  121. package/dist/media/properties.js.map +1 -1
  122. package/dist/media/util.js +2 -9
  123. package/dist/media/util.js.map +1 -1
  124. package/dist/mediaQualityMetrics/config.js +316 -501
  125. package/dist/mediaQualityMetrics/config.js.map +1 -1
  126. package/dist/meeting/in-meeting-actions.js +97 -14
  127. package/dist/meeting/in-meeting-actions.js.map +1 -1
  128. package/dist/meeting/index.js +5311 -3871
  129. package/dist/meeting/index.js.map +1 -1
  130. package/dist/meeting/locusMediaRequest.js +292 -0
  131. package/dist/meeting/locusMediaRequest.js.map +1 -0
  132. package/dist/meeting/muteState.js +260 -183
  133. package/dist/meeting/muteState.js.map +1 -1
  134. package/dist/meeting/request.js +421 -347
  135. package/dist/meeting/request.js.map +1 -1
  136. package/dist/meeting/request.type.js +7 -0
  137. package/dist/meeting/request.type.js.map +1 -0
  138. package/dist/meeting/state.js +21 -31
  139. package/dist/meeting/state.js.map +1 -1
  140. package/dist/meeting/util.js +672 -585
  141. package/dist/meeting/util.js.map +1 -1
  142. package/dist/meeting/voicea-meeting.js +172 -0
  143. package/dist/meeting/voicea-meeting.js.map +1 -0
  144. package/dist/meeting-info/collection.js +6 -25
  145. package/dist/meeting-info/collection.js.map +1 -1
  146. package/dist/meeting-info/index.js +87 -39
  147. package/dist/meeting-info/index.js.map +1 -1
  148. package/dist/meeting-info/meeting-info-v2.js +352 -283
  149. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  150. package/dist/meeting-info/request.js +3 -15
  151. package/dist/meeting-info/request.js.map +1 -1
  152. package/dist/meeting-info/util.js +99 -183
  153. package/dist/meeting-info/util.js.map +1 -1
  154. package/dist/meeting-info/utilv2.js +147 -234
  155. package/dist/meeting-info/utilv2.js.map +1 -1
  156. package/dist/meetings/collection.js +43 -19
  157. package/dist/meetings/collection.js.map +1 -1
  158. package/dist/meetings/index.js +895 -600
  159. package/dist/meetings/index.js.map +1 -1
  160. package/dist/meetings/meetings.types.js +7 -0
  161. package/dist/meetings/meetings.types.js.map +1 -0
  162. package/dist/meetings/request.js +26 -41
  163. package/dist/meetings/request.js.map +1 -1
  164. package/dist/meetings/util.js +184 -157
  165. package/dist/meetings/util.js.map +1 -1
  166. package/dist/member/index.js +134 -85
  167. package/dist/member/index.js.map +1 -1
  168. package/dist/member/types.js +25 -0
  169. package/dist/member/types.js.map +1 -0
  170. package/dist/member/util.js +158 -88
  171. package/dist/member/util.js.map +1 -1
  172. package/dist/members/collection.js +13 -12
  173. package/dist/members/collection.js.map +1 -1
  174. package/dist/members/index.js +194 -204
  175. package/dist/members/index.js.map +1 -1
  176. package/dist/members/request.js +113 -68
  177. package/dist/members/request.js.map +1 -1
  178. package/dist/members/types.js +15 -0
  179. package/dist/members/types.js.map +1 -0
  180. package/dist/members/util.js +324 -259
  181. package/dist/members/util.js.map +1 -1
  182. package/dist/metrics/constants.js +19 -7
  183. package/dist/metrics/constants.js.map +1 -1
  184. package/dist/metrics/index.js +11 -558
  185. package/dist/metrics/index.js.map +1 -1
  186. package/dist/multistream/mediaRequestManager.js +263 -50
  187. package/dist/multistream/mediaRequestManager.js.map +1 -1
  188. package/dist/multistream/receiveSlot.js +58 -65
  189. package/dist/multistream/receiveSlot.js.map +1 -1
  190. package/dist/multistream/receiveSlotManager.js +76 -95
  191. package/dist/multistream/receiveSlotManager.js.map +1 -1
  192. package/dist/multistream/remoteMedia.js +62 -76
  193. package/dist/multistream/remoteMedia.js.map +1 -1
  194. package/dist/multistream/remoteMediaGroup.js +82 -45
  195. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  196. package/dist/multistream/remoteMediaManager.js +657 -448
  197. package/dist/multistream/remoteMediaManager.js.map +1 -1
  198. package/dist/multistream/sendSlotManager.js +255 -0
  199. package/dist/multistream/sendSlotManager.js.map +1 -0
  200. package/dist/networkQualityMonitor/index.js +40 -59
  201. package/dist/networkQualityMonitor/index.js.map +1 -1
  202. package/dist/personal-meeting-room/index.js +21 -45
  203. package/dist/personal-meeting-room/index.js.map +1 -1
  204. package/dist/personal-meeting-room/request.js +1 -31
  205. package/dist/personal-meeting-room/request.js.map +1 -1
  206. package/dist/personal-meeting-room/util.js +0 -13
  207. package/dist/personal-meeting-room/util.js.map +1 -1
  208. package/dist/reachability/clusterReachability.js +356 -0
  209. package/dist/reachability/clusterReachability.js.map +1 -0
  210. package/dist/reachability/index.js +297 -460
  211. package/dist/reachability/index.js.map +1 -1
  212. package/dist/reachability/request.js +20 -26
  213. package/dist/reachability/request.js.map +1 -1
  214. package/dist/reachability/util.js +29 -0
  215. package/dist/reachability/util.js.map +1 -0
  216. package/dist/reactions/constants.js +13 -0
  217. package/dist/reactions/constants.js.map +1 -0
  218. package/dist/reactions/reactions.js +109 -0
  219. package/dist/reactions/reactions.js.map +1 -0
  220. package/dist/reactions/reactions.type.js +36 -0
  221. package/dist/reactions/reactions.type.js.map +1 -0
  222. package/dist/reconnection-manager/index.js +413 -483
  223. package/dist/reconnection-manager/index.js.map +1 -1
  224. package/dist/recording-controller/enums.js +17 -0
  225. package/dist/recording-controller/enums.js.map +1 -0
  226. package/dist/recording-controller/index.js +362 -0
  227. package/dist/recording-controller/index.js.map +1 -0
  228. package/dist/recording-controller/util.js +64 -0
  229. package/dist/recording-controller/util.js.map +1 -0
  230. package/dist/roap/index.js +102 -86
  231. package/dist/roap/index.js.map +1 -1
  232. package/dist/roap/request.js +131 -135
  233. package/dist/roap/request.js.map +1 -1
  234. package/dist/roap/turnDiscovery.js +437 -116
  235. package/dist/roap/turnDiscovery.js.map +1 -1
  236. package/dist/rtcMetrics/constants.js +12 -0
  237. package/dist/rtcMetrics/constants.js.map +1 -0
  238. package/dist/rtcMetrics/index.js +179 -0
  239. package/dist/rtcMetrics/index.js.map +1 -0
  240. package/dist/statsAnalyzer/global.js +1 -95
  241. package/dist/statsAnalyzer/global.js.map +1 -1
  242. package/dist/statsAnalyzer/index.js +557 -583
  243. package/dist/statsAnalyzer/index.js.map +1 -1
  244. package/dist/statsAnalyzer/mqaUtil.js +326 -130
  245. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  246. package/dist/transcription/index.js +22 -47
  247. package/dist/transcription/index.js.map +1 -1
  248. package/dist/types/annotation/annotation.types.d.ts +42 -0
  249. package/dist/types/annotation/constants.d.ts +31 -0
  250. package/dist/types/annotation/index.d.ts +117 -0
  251. package/dist/types/breakouts/breakout.d.ts +8 -0
  252. package/dist/types/breakouts/collection.d.ts +5 -0
  253. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  254. package/dist/types/breakouts/events.d.ts +8 -0
  255. package/dist/types/breakouts/index.d.ts +5 -0
  256. package/dist/types/breakouts/request.d.ts +22 -0
  257. package/dist/types/breakouts/utils.d.ts +15 -0
  258. package/dist/types/common/browser-detection.d.ts +9 -0
  259. package/dist/types/common/collection.d.ts +48 -0
  260. package/dist/types/common/config.d.ts +2 -0
  261. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  262. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  263. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  264. package/dist/types/common/errors/media.d.ts +15 -0
  265. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  266. package/dist/types/common/errors/parameter.d.ts +15 -0
  267. package/dist/types/common/errors/password-error.d.ts +15 -0
  268. package/dist/types/common/errors/permission.d.ts +14 -0
  269. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  270. package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
  271. package/dist/types/common/errors/reconnection.d.ts +15 -0
  272. package/dist/types/common/errors/stats.d.ts +15 -0
  273. package/dist/types/common/errors/webex-errors.d.ts +93 -0
  274. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  275. package/dist/types/common/events/events-scope.d.ts +17 -0
  276. package/dist/types/common/events/events.d.ts +12 -0
  277. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  278. package/dist/types/common/events/util.d.ts +2 -0
  279. package/dist/types/common/logs/logger-config.d.ts +2 -0
  280. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  281. package/dist/types/common/logs/request.d.ts +36 -0
  282. package/dist/types/common/queue.d.ts +34 -0
  283. package/dist/types/config.d.ts +72 -0
  284. package/dist/types/constants.d.ts +1088 -0
  285. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  286. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  287. package/dist/types/controls-options-manager/index.d.ts +136 -0
  288. package/dist/types/controls-options-manager/types.d.ts +43 -0
  289. package/dist/types/controls-options-manager/util.d.ts +1 -0
  290. package/dist/types/index.d.ts +7 -0
  291. package/dist/types/interceptors/index.d.ts +2 -0
  292. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  293. package/dist/types/interpretation/collection.d.ts +5 -0
  294. package/dist/types/interpretation/index.d.ts +5 -0
  295. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  296. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  297. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  298. package/dist/types/locus-info/fullState.d.ts +2 -0
  299. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  300. package/dist/types/locus-info/index.d.ts +322 -0
  301. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  302. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  303. package/dist/types/locus-info/parser.d.ts +272 -0
  304. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  305. package/dist/types/media/index.d.ts +34 -0
  306. package/dist/types/media/properties.d.ts +93 -0
  307. package/dist/types/media/util.d.ts +2 -0
  308. package/dist/types/mediaQualityMetrics/config.d.ts +241 -0
  309. package/dist/types/meeting/in-meeting-actions.d.ts +167 -0
  310. package/dist/types/meeting/index.d.ts +1824 -0
  311. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  312. package/dist/types/meeting/muteState.d.ts +178 -0
  313. package/dist/types/meeting/request.d.ts +293 -0
  314. package/dist/types/meeting/request.type.d.ts +11 -0
  315. package/dist/types/meeting/state.d.ts +9 -0
  316. package/dist/types/meeting/util.d.ts +118 -0
  317. package/dist/types/meeting/voicea-meeting.d.ts +16 -0
  318. package/dist/types/meeting-info/collection.d.ts +20 -0
  319. package/dist/types/meeting-info/index.d.ts +69 -0
  320. package/dist/types/meeting-info/meeting-info-v2.d.ts +123 -0
  321. package/dist/types/meeting-info/request.d.ts +22 -0
  322. package/dist/types/meeting-info/util.d.ts +2 -0
  323. package/dist/types/meeting-info/utilv2.d.ts +2 -0
  324. package/dist/types/meetings/collection.d.ts +40 -0
  325. package/dist/types/meetings/index.d.ts +389 -0
  326. package/dist/types/meetings/meetings.types.d.ts +4 -0
  327. package/dist/types/meetings/request.d.ts +27 -0
  328. package/dist/types/meetings/util.d.ts +18 -0
  329. package/dist/types/member/index.d.ts +160 -0
  330. package/dist/types/member/types.d.ts +32 -0
  331. package/dist/types/member/util.d.ts +2 -0
  332. package/dist/types/members/collection.d.ts +29 -0
  333. package/dist/types/members/index.d.ts +353 -0
  334. package/dist/types/members/request.d.ts +114 -0
  335. package/dist/types/members/types.d.ts +25 -0
  336. package/dist/types/members/util.d.ts +215 -0
  337. package/dist/types/metrics/constants.d.ts +70 -0
  338. package/dist/types/metrics/index.d.ts +45 -0
  339. package/dist/types/multistream/mediaRequestManager.d.ts +120 -0
  340. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  341. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  342. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  343. package/dist/types/multistream/remoteMediaGroup.d.ts +49 -0
  344. package/dist/types/multistream/remoteMediaManager.d.ts +301 -0
  345. package/dist/types/multistream/sendSlotManager.d.ts +70 -0
  346. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  347. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  348. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  349. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  350. package/dist/types/reachability/clusterReachability.d.ts +109 -0
  351. package/dist/types/reachability/index.d.ts +105 -0
  352. package/dist/types/reachability/request.d.ts +39 -0
  353. package/dist/types/reachability/util.d.ts +8 -0
  354. package/dist/types/reactions/constants.d.ts +3 -0
  355. package/dist/types/reactions/reactions.d.ts +4 -0
  356. package/dist/types/reactions/reactions.type.d.ts +52 -0
  357. package/dist/types/reconnection-manager/index.d.ts +136 -0
  358. package/dist/types/recording-controller/enums.d.ts +7 -0
  359. package/dist/types/recording-controller/index.d.ts +207 -0
  360. package/dist/types/recording-controller/util.d.ts +14 -0
  361. package/dist/types/roap/index.d.ts +86 -0
  362. package/dist/types/roap/request.d.ts +39 -0
  363. package/dist/types/roap/turnDiscovery.d.ts +155 -0
  364. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  365. package/dist/types/rtcMetrics/index.d.ts +61 -0
  366. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  367. package/dist/types/statsAnalyzer/index.d.ts +217 -0
  368. package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
  369. package/dist/types/transcription/index.d.ts +64 -0
  370. package/dist/types/webinar/collection.d.ts +16 -0
  371. package/dist/types/webinar/index.d.ts +5 -0
  372. package/dist/webinar/collection.js +44 -0
  373. package/dist/webinar/collection.js.map +1 -0
  374. package/dist/webinar/index.js +69 -0
  375. package/dist/webinar/index.js.map +1 -0
  376. package/internal-README.md +7 -6
  377. package/package.json +30 -21
  378. package/src/annotation/annotation.types.ts +50 -0
  379. package/src/annotation/constants.ts +36 -0
  380. package/src/annotation/index.ts +328 -0
  381. package/src/breakouts/README.md +220 -0
  382. package/src/breakouts/breakout.ts +188 -0
  383. package/src/breakouts/collection.ts +19 -0
  384. package/src/breakouts/edit-lock-error.ts +25 -0
  385. package/src/breakouts/events.ts +56 -0
  386. package/src/breakouts/index.ts +925 -0
  387. package/src/breakouts/request.ts +55 -0
  388. package/src/breakouts/utils.ts +57 -0
  389. package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
  390. package/src/common/collection.ts +9 -7
  391. package/src/common/{config.js → config.ts} +1 -1
  392. package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
  393. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
  394. package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
  395. package/src/common/errors/{media.js → media.ts} +11 -7
  396. package/src/common/errors/no-meeting-info.ts +24 -0
  397. package/src/common/errors/parameter.ts +11 -7
  398. package/src/common/errors/{password-error.js → password-error.ts} +11 -7
  399. package/src/common/errors/{permission.js → permission.ts} +10 -6
  400. package/src/common/errors/reclaim-host-role-errors.ts +134 -0
  401. package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
  402. package/src/common/errors/{stats.js → stats.ts} +11 -7
  403. package/src/common/errors/{webex-errors.js → webex-errors.ts} +51 -8
  404. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
  405. package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
  406. package/src/common/events/{events.js → events.ts} +5 -1
  407. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
  408. package/src/common/events/{util.js → util.ts} +2 -3
  409. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  410. package/src/common/logs/logger-proxy.ts +44 -0
  411. package/src/common/logs/{request.js → request.ts} +26 -9
  412. package/src/common/queue.ts +22 -9
  413. package/src/{config.js → config.ts} +19 -21
  414. package/src/constants.ts +296 -27
  415. package/src/controls-options-manager/constants.ts +5 -0
  416. package/src/controls-options-manager/enums.ts +18 -0
  417. package/src/controls-options-manager/index.ts +278 -0
  418. package/src/controls-options-manager/types.ts +59 -0
  419. package/src/controls-options-manager/util.ts +300 -0
  420. package/src/index.ts +45 -0
  421. package/src/interceptors/index.ts +3 -0
  422. package/src/interceptors/locusRetry.ts +67 -0
  423. package/src/interpretation/README.md +60 -0
  424. package/src/interpretation/collection.ts +19 -0
  425. package/src/interpretation/index.ts +349 -0
  426. package/src/interpretation/siLanguage.ts +18 -0
  427. package/src/locus-info/controlsUtils.ts +222 -0
  428. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  429. package/src/locus-info/{fullState.js → fullState.ts} +16 -12
  430. package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
  431. package/src/locus-info/{index.js → index.ts} +561 -119
  432. package/src/locus-info/{infoUtils.js → infoUtils.ts} +29 -10
  433. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +97 -17
  434. package/src/locus-info/{parser.js → parser.ts} +303 -104
  435. package/src/locus-info/{selfUtils.js → selfUtils.ts} +199 -68
  436. package/src/media/index.ts +460 -0
  437. package/src/media/properties.ts +283 -0
  438. package/src/media/{util.js → util.ts} +2 -2
  439. package/src/mediaQualityMetrics/config.ts +249 -0
  440. package/src/meeting/in-meeting-actions.ts +199 -3
  441. package/src/meeting/index.ts +8494 -0
  442. package/src/meeting/locusMediaRequest.ts +313 -0
  443. package/src/meeting/muteState.ts +465 -0
  444. package/src/meeting/request.ts +912 -0
  445. package/src/meeting/request.type.ts +13 -0
  446. package/src/meeting/{state.js → state.ts} +50 -35
  447. package/src/meeting/util.ts +799 -0
  448. package/src/meeting/voicea-meeting.ts +122 -0
  449. package/src/meeting-info/{collection.js → collection.ts} +6 -2
  450. package/src/meeting-info/index.ts +210 -0
  451. package/src/meeting-info/meeting-info-v2.ts +423 -0
  452. package/src/meeting-info/{request.js → request.ts} +14 -4
  453. package/src/meeting-info/{util.js → util.ts} +70 -58
  454. package/src/meeting-info/{utilv2.js → utilv2.ts} +99 -82
  455. package/src/meetings/collection.ts +76 -0
  456. package/src/meetings/index.ts +1539 -0
  457. package/src/meetings/meetings.types.ts +12 -0
  458. package/src/meetings/{request.js → request.ts} +34 -25
  459. package/src/meetings/{util.js → util.ts} +133 -38
  460. package/src/member/{index.js → index.ts} +159 -56
  461. package/src/member/types.ts +38 -0
  462. package/src/member/util.ts +397 -0
  463. package/src/members/{collection.js → collection.ts} +10 -2
  464. package/src/members/{index.js → index.ts} +351 -146
  465. package/src/members/request.ts +255 -0
  466. package/src/members/types.ts +29 -0
  467. package/src/members/util.ts +353 -0
  468. package/src/metrics/{constants.js → constants.ts} +17 -6
  469. package/src/metrics/index.ts +73 -0
  470. package/src/multistream/mediaRequestManager.ts +341 -64
  471. package/src/multistream/receiveSlot.ts +69 -26
  472. package/src/multistream/receiveSlotManager.ts +66 -42
  473. package/src/multistream/remoteMedia.ts +40 -5
  474. package/src/multistream/remoteMediaGroup.ts +82 -3
  475. package/src/multistream/remoteMediaManager.ts +401 -81
  476. package/src/multistream/sendSlotManager.ts +199 -0
  477. package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
  478. package/src/personal-meeting-room/{index.js → index.ts} +28 -19
  479. package/src/personal-meeting-room/{request.js → request.ts} +13 -4
  480. package/src/personal-meeting-room/{util.js → util.ts} +4 -4
  481. package/src/reachability/clusterReachability.ts +320 -0
  482. package/src/reachability/index.ts +371 -0
  483. package/src/reachability/request.ts +50 -35
  484. package/src/reachability/util.ts +24 -0
  485. package/src/reactions/constants.ts +4 -0
  486. package/src/reactions/reactions.ts +104 -0
  487. package/src/reactions/reactions.type.ts +62 -0
  488. package/src/reconnection-manager/index.ts +643 -0
  489. package/src/recording-controller/enums.ts +8 -0
  490. package/src/recording-controller/index.ts +332 -0
  491. package/src/recording-controller/util.ts +75 -0
  492. package/src/roap/index.ts +288 -0
  493. package/src/roap/request.ts +153 -0
  494. package/src/roap/turnDiscovery.ts +374 -70
  495. package/src/rtcMetrics/constants.ts +3 -0
  496. package/src/rtcMetrics/index.ts +166 -0
  497. package/src/statsAnalyzer/global.ts +37 -0
  498. package/src/statsAnalyzer/index.ts +1275 -0
  499. package/src/statsAnalyzer/mqaUtil.ts +440 -0
  500. package/src/transcription/{index.js → index.ts} +46 -39
  501. package/src/webinar/collection.ts +31 -0
  502. package/src/webinar/index.ts +62 -0
  503. package/test/integration/spec/converged-space-meetings.js +233 -0
  504. package/test/integration/spec/journey.js +791 -531
  505. package/test/integration/spec/space-meeting.js +391 -204
  506. package/test/integration/spec/transcription.js +7 -8
  507. package/test/unit/spec/annotation/index.ts +418 -0
  508. package/test/unit/spec/breakouts/breakout.ts +238 -0
  509. package/test/unit/spec/breakouts/collection.ts +15 -0
  510. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  511. package/test/unit/spec/breakouts/events.ts +89 -0
  512. package/test/unit/spec/breakouts/index.ts +1793 -0
  513. package/test/unit/spec/breakouts/request.ts +104 -0
  514. package/test/unit/spec/breakouts/utils.js +72 -0
  515. package/test/unit/spec/common/browser-detection.js +9 -28
  516. package/test/unit/spec/common/queue.js +31 -2
  517. package/test/unit/spec/controls-options-manager/index.js +287 -0
  518. package/test/unit/spec/controls-options-manager/util.js +582 -0
  519. package/test/unit/spec/fixture/locus.js +93 -90
  520. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  521. package/test/unit/spec/interpretation/collection.ts +15 -0
  522. package/test/unit/spec/interpretation/index.ts +625 -0
  523. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  524. package/test/unit/spec/locus-info/controlsUtils.js +325 -32
  525. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  526. package/test/unit/spec/locus-info/index.js +1458 -21
  527. package/test/unit/spec/locus-info/infoUtils.js +71 -40
  528. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  529. package/test/unit/spec/locus-info/lib/SeqCmp.json +529 -685
  530. package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
  531. package/test/unit/spec/locus-info/parser.js +119 -44
  532. package/test/unit/spec/locus-info/selfConstant.js +120 -103
  533. package/test/unit/spec/locus-info/selfUtils.js +291 -12
  534. package/test/unit/spec/media/index.ts +194 -111
  535. package/test/unit/spec/media/properties.ts +11 -11
  536. package/test/unit/spec/meeting/in-meeting-actions.ts +96 -3
  537. package/test/unit/spec/meeting/index.js +8616 -1921
  538. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  539. package/test/unit/spec/meeting/muteState.js +568 -207
  540. package/test/unit/spec/meeting/request.js +602 -82
  541. package/test/unit/spec/meeting/utils.js +867 -179
  542. package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
  543. package/test/unit/spec/meeting-info/index.js +300 -0
  544. package/test/unit/spec/meeting-info/meetinginfov2.js +631 -78
  545. package/test/unit/spec/meeting-info/request.js +7 -9
  546. package/test/unit/spec/meeting-info/util.js +11 -12
  547. package/test/unit/spec/meeting-info/utilv2.js +131 -74
  548. package/test/unit/spec/meetings/collection.js +27 -1
  549. package/test/unit/spec/meetings/index.js +1826 -374
  550. package/test/unit/spec/meetings/utils.js +243 -14
  551. package/test/unit/spec/member/index.js +61 -7
  552. package/test/unit/spec/member/util.js +526 -26
  553. package/test/unit/spec/members/index.js +536 -55
  554. package/test/unit/spec/members/request.js +228 -40
  555. package/test/unit/spec/members/utils.js +217 -4
  556. package/test/unit/spec/metrics/index.js +13 -68
  557. package/test/unit/spec/multistream/mediaRequestManager.ts +1032 -110
  558. package/test/unit/spec/multistream/receiveSlot.ts +77 -18
  559. package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
  560. package/test/unit/spec/multistream/remoteMedia.ts +40 -2
  561. package/test/unit/spec/multistream/remoteMediaGroup.ts +350 -5
  562. package/test/unit/spec/multistream/remoteMediaManager.ts +937 -65
  563. package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
  564. package/test/unit/spec/networkQualityMonitor/index.js +24 -18
  565. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  566. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  567. package/test/unit/spec/reachability/index.ts +606 -26
  568. package/test/unit/spec/reachability/request.js +68 -0
  569. package/test/unit/spec/reachability/util.ts +40 -0
  570. package/test/unit/spec/reconnection-manager/index.js +222 -34
  571. package/test/unit/spec/recording-controller/index.js +306 -0
  572. package/test/unit/spec/recording-controller/util.js +229 -0
  573. package/test/unit/spec/roap/index.ts +238 -82
  574. package/test/unit/spec/roap/request.ts +255 -0
  575. package/test/unit/spec/roap/turnDiscovery.ts +707 -110
  576. package/test/unit/spec/rtcMetrics/index.ts +122 -0
  577. package/test/unit/spec/stats-analyzer/index.js +1331 -62
  578. package/test/unit/spec/webinar/collection.ts +13 -0
  579. package/test/unit/spec/webinar/index.ts +60 -0
  580. package/test/utils/cmr.js +44 -42
  581. package/test/utils/constants.js +9 -0
  582. package/test/utils/integrationTestUtils.js +46 -0
  583. package/test/utils/testUtils.js +63 -99
  584. package/test/utils/webex-config.js +22 -18
  585. package/test/utils/webex-test-users.js +65 -50
  586. package/tsconfig.json +6 -0
  587. package/dist/media/internal-media-core-wrapper.js +0 -22
  588. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  589. package/dist/meeting/effectsState.js +0 -327
  590. package/dist/meeting/effectsState.js.map +0 -1
  591. package/dist/metrics/config.js +0 -301
  592. package/dist/metrics/config.js.map +0 -1
  593. package/dist/multistream/multistreamMedia.js +0 -116
  594. package/dist/multistream/multistreamMedia.js.map +0 -1
  595. package/dist/peer-connection-manager/util.js +0 -124
  596. package/dist/peer-connection-manager/util.js.map +0 -1
  597. package/src/common/logs/logger-proxy.js +0 -33
  598. package/src/index.js +0 -15
  599. package/src/locus-info/controlsUtils.js +0 -102
  600. package/src/media/index.js +0 -459
  601. package/src/media/internal-media-core-wrapper.ts +0 -9
  602. package/src/media/properties.js +0 -289
  603. package/src/mediaQualityMetrics/config.js +0 -382
  604. package/src/meeting/effectsState.js +0 -205
  605. package/src/meeting/index.js +0 -6284
  606. package/src/meeting/muteState.js +0 -318
  607. package/src/meeting/request.js +0 -684
  608. package/src/meeting/util.js +0 -506
  609. package/src/meeting-info/index.js +0 -131
  610. package/src/meeting-info/meeting-info-v2.js +0 -255
  611. package/src/meetings/collection.js +0 -40
  612. package/src/meetings/index.js +0 -1015
  613. package/src/member/util.js +0 -254
  614. package/src/members/request.js +0 -131
  615. package/src/members/util.js +0 -258
  616. package/src/metrics/config.js +0 -324
  617. package/src/metrics/index.js +0 -530
  618. package/src/multistream/multistreamMedia.ts +0 -92
  619. package/src/peer-connection-manager/util.ts +0 -117
  620. package/src/reachability/index.js +0 -464
  621. package/src/reconnection-manager/index.js +0 -519
  622. package/src/roap/index.js +0 -220
  623. package/src/roap/request.js +0 -127
  624. package/src/statsAnalyzer/global.js +0 -133
  625. package/src/statsAnalyzer/index.js +0 -1006
  626. package/src/statsAnalyzer/mqaUtil.js +0 -173
  627. package/test/unit/spec/meeting/effectsState.js +0 -291
  628. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  629. /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
@@ -1,8 +1,30 @@
1
1
  import {difference} from 'lodash';
2
2
 
3
- import SimpleQueue from '../common/queue';
3
+ import SortedQueue from '../common/queue';
4
4
  import LoggerProxy from '../common/logs/logger-proxy';
5
5
 
6
+ import Metrics from '../metrics';
7
+ import BEHAVIORAL_METRICS from '../metrics/constants';
8
+
9
+ const MAX_OOO_DELTA_COUNT = 5; // when we receive an out-of-order delta and the queue builds up to MAX_OOO_DELTA_COUNT, we do a sync with Locus
10
+ const OOO_DELTA_WAIT_TIME = 10000; // [ms] minimum wait time before we do a sync if we get out-of-order deltas
11
+ const OOO_DELTA_WAIT_TIME_RANDOM_DELAY = 5000; // [ms] max random delay added to OOO_DELTA_WAIT_TIME
12
+
13
+ type LocusDeltaDto = {
14
+ url: string;
15
+ baseSequence: {
16
+ rangeStart: number;
17
+ rangeEnd: number;
18
+ entries: number[];
19
+ };
20
+ sequence: {
21
+ rangeStart: number;
22
+ rangeEnd: number;
23
+ entries: number[];
24
+ };
25
+ syncUrl: string;
26
+ };
27
+
6
28
  /**
7
29
  * Locus Delta Parser
8
30
  * @private
@@ -10,11 +32,11 @@ import LoggerProxy from '../common/logs/logger-proxy';
10
32
  */
11
33
  export default class Parser {
12
34
  // processing status
13
- static status = {
14
- IDLE: 'IDLE',
15
- PAUSED: 'PAUSED',
16
- WORKING: 'WORKING'
17
- };
35
+ status:
36
+ | 'IDLE' // not doing anything
37
+ | 'PAUSED' // paused, because we are doing a sync
38
+ | 'WORKING' // processing a delta event
39
+ | 'BLOCKED'; // received an out-of-order delta, so waiting for the missing one
18
40
 
19
41
  // loci comparison states
20
42
  static loci = {
@@ -24,20 +46,61 @@ export default class Parser {
24
46
  DESYNC: 'DESYNC',
25
47
  USE_INCOMING: 'USE_INCOMING',
26
48
  USE_CURRENT: 'USE_CURRENT',
27
- ERROR: 'ERROR'
49
+ WAIT: 'WAIT',
50
+ ERROR: 'ERROR',
51
+ LOCUS_URL_CHANGED: 'LOCUS_URL_CHANGED',
28
52
  };
29
53
 
54
+ queue: SortedQueue<LocusDeltaDto>;
55
+ workingCopy: any;
56
+ syncTimer?: ReturnType<typeof setTimeout>;
30
57
 
31
58
  /**
32
59
  * @constructs Parser
33
60
  */
34
61
  constructor() {
35
- this.queue = new SimpleQueue();
36
- this.status = Parser.status.IDLE;
62
+ const deltaCompareFunc = (left: LocusDeltaDto, right: LocusDeltaDto) => {
63
+ const {LT, GT} = Parser.loci;
64
+ const {extractComparisonState: extract} = Parser;
65
+
66
+ if (Parser.isSequenceEmpty(left)) {
67
+ return -1;
68
+ }
69
+ if (Parser.isSequenceEmpty(right)) {
70
+ return 1;
71
+ }
72
+ const result = extract(Parser.compareSequence(left.baseSequence, right.baseSequence));
73
+
74
+ if (result === LT) {
75
+ return -1;
76
+ }
77
+ if (result === GT) {
78
+ return 1;
79
+ }
80
+
81
+ return 0;
82
+ };
83
+
84
+ this.queue = new SortedQueue<LocusDeltaDto>(deltaCompareFunc);
85
+ this.status = 'IDLE';
37
86
  this.onDeltaAction = null;
38
87
  this.workingCopy = null;
88
+ this.syncTimer = undefined;
39
89
  }
40
90
 
91
+ /**
92
+ * Returns a debug string representing a locus delta - useful for logging
93
+ *
94
+ * @param {LocusDeltaDto} locus Locus delta
95
+ * @returns {string}
96
+ */
97
+ static locus2string(locus: LocusDeltaDto) {
98
+ if (!locus.sequence?.entries) {
99
+ return 'invalid';
100
+ }
101
+
102
+ return locus.sequence.entries.length ? `seq=${locus.sequence.entries.at(-1)}` : 'empty';
103
+ }
41
104
 
42
105
  /**
43
106
  * Checks if two sequences overlap in time,
@@ -65,7 +128,6 @@ export default class Parser {
65
128
  return comparison;
66
129
  }
67
130
 
68
-
69
131
  /**
70
132
  * Checks if two sequences have unequal ranges.
71
133
  * Chooses sequence with most larger range.
@@ -91,8 +153,7 @@ export default class Parser {
91
153
  else if (currentTotalRange < incomingTotalRange) {
92
154
  // choose right side (incoming)
93
155
  comparison = `${Parser.loci.LT}:UR002`;
94
- }
95
- else {
156
+ } else {
96
157
  // with no unique entries and with ranges either absent or
97
158
  // of the same size, the sequences are considered equal.
98
159
  comparison = `${Parser.loci.EQ}:UR003`;
@@ -102,7 +163,6 @@ export default class Parser {
102
163
  return comparison;
103
164
  }
104
165
 
105
-
106
166
  /**
107
167
  * Checks if either sequences has unique entries.
108
168
  * Entries are considered unique if they do not overlap
@@ -131,7 +191,6 @@ export default class Parser {
131
191
  return comparison;
132
192
  }
133
193
 
134
-
135
194
  /**
136
195
  * Checks both Locus Delta objects to see if they are
137
196
  * out of sync with one another. If so sends a DESYNC
@@ -161,12 +220,10 @@ export default class Parser {
161
220
 
162
221
  // send DESYNC to server
163
222
  comparison = `${Parser.loci.DESYNC}:OOS001:${debugInfo}`;
164
- }
165
- else if (currentUniqueMin > incomingUniqueMin) {
223
+ } else if (currentUniqueMin > incomingUniqueMin) {
166
224
  // choose left side (current)
167
225
  comparison = `${Parser.loci.GT}:OOS002`;
168
- }
169
- else {
226
+ } else {
170
227
  // choose right side (incoming)
171
228
  comparison = `${Parser.loci.LT}:OOS003`;
172
229
  }
@@ -174,7 +231,6 @@ export default class Parser {
174
231
  return comparison;
175
232
  }
176
233
 
177
-
178
234
  /**
179
235
  * Compares two loci to determine which one contains the most recent state
180
236
  * @instance
@@ -188,7 +244,6 @@ export default class Parser {
188
244
  const {extractComparisonState: extract} = Parser;
189
245
  const {packComparisonResult: pack} = Parser;
190
246
 
191
-
192
247
  if (isSequenceEmpty(current) || isSequenceEmpty(incoming)) {
193
248
  return pack(Parser.loci.USE_INCOMING, 'C001');
194
249
  }
@@ -203,7 +258,6 @@ export default class Parser {
203
258
  return pack(action, result);
204
259
  }
205
260
 
206
-
207
261
  /**
208
262
  * Compares two loci sequences (with delta params) and indicates what action
209
263
  * to take.
@@ -214,21 +268,26 @@ export default class Parser {
214
268
  * @private
215
269
  * @returns {string} loci comparison state
216
270
  */
217
- static compareDelta(current, incoming) {
218
- const {
219
- LT, GT, EQ, DESYNC, USE_INCOMING
220
- } = Parser.loci;
271
+ private static compareDelta(current, incoming) {
272
+ const {LT, GT, EQ, DESYNC, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = Parser.loci;
273
+
221
274
  const {extractComparisonState: extract} = Parser;
222
275
  const {packComparisonResult: pack} = Parser;
223
276
 
224
277
  const result = Parser.compareSequence(current.sequence, incoming.sequence);
225
278
  let comparison = extract(result);
226
279
 
227
-
228
280
  if (comparison !== LT) {
229
281
  return pack(Parser.compareToAction(comparison), result);
230
282
  }
231
283
 
284
+ if (incoming.url !== current.url) {
285
+ // when moving to/from a breakout session, the locus URL will change and also
286
+ // the baseSequence, making incoming and current incomparable, so use a
287
+ // unique comparison state
288
+ return pack(LOCUS_URL_CHANGED, result);
289
+ }
290
+
232
291
  comparison = Parser.compareSequence(current.sequence, incoming.baseSequence);
233
292
 
234
293
  switch (extract(comparison)) {
@@ -237,6 +296,21 @@ export default class Parser {
237
296
  comparison = USE_INCOMING;
238
297
  break;
239
298
 
299
+ case LT:
300
+ if (extract(Parser.compareSequence(incoming.baseSequence, incoming.sequence)) === EQ) {
301
+ // special case where Locus sends a delta with baseSequence === sequence to trigger a sync,
302
+ // because the delta event is too large to be sent over mercury connection
303
+ comparison = DESYNC;
304
+ } else {
305
+ // the incoming locus has baseSequence from the future, so it is out-of-order,
306
+ // we are missing 1 or more locus that should be in front of it, we need to wait for it
307
+ comparison = WAIT;
308
+
309
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.LOCUS_DELTA_OUT_OF_ORDER, {
310
+ stack: new Error().stack,
311
+ });
312
+ }
313
+ break;
240
314
  default:
241
315
  comparison = DESYNC;
242
316
  }
@@ -244,6 +318,48 @@ export default class Parser {
244
318
  return pack(comparison, result);
245
319
  }
246
320
 
321
+ /**
322
+ * Compares Locus sequences - it should be called only for full Locus DTOs, not deltas
323
+ *
324
+ * @param {Types~Locus} current Current working copy
325
+ * @param {Types~Locus} incomingFullDto New Full Locus DTO
326
+ * @returns {string} either Parser.loci.USE_INCOMING or Parser.loci.USE_CURRENT
327
+ */
328
+ static compareFullDtoSequence(current, incomingFullDto) {
329
+ if (Parser.isSequenceEmpty(current) || Parser.isSequenceEmpty(incomingFullDto)) {
330
+ return Parser.loci.USE_INCOMING;
331
+ }
332
+
333
+ // the sequence.entries list will always contain at least 1 entry
334
+ // https://sqbu-github.cisco.com/WebExSquared/cloud-apps/wiki/Locus-Sequence-Comparison-Algorithm
335
+
336
+ return incomingFullDto.sequence.entries.slice(-1)[0] > current.sequence.entries.slice(-1)[0]
337
+ ? Parser.loci.USE_INCOMING
338
+ : Parser.loci.USE_CURRENT;
339
+ }
340
+
341
+ /**
342
+ * Returns true if the incoming full locus DTO is newer than the current working copy
343
+ *
344
+ * @param {Types~Locus} incomingFullDto New Full Locus DTO
345
+ * @returns {string} either Parser.loci.USE_INCOMING or Parser.loci.USE_CURRENT
346
+ */
347
+ isNewFullLocus(incomingFullDto) {
348
+ if (!Parser.isLoci(incomingFullDto)) {
349
+ LoggerProxy.logger.info('Locus-info:parser#isNewFullLocus --> Ignoring non-locus object.');
350
+
351
+ return false;
352
+ }
353
+
354
+ if (!this.workingCopy) {
355
+ // we don't have a working copy yet, so any full locus is better than nothing
356
+ return true;
357
+ }
358
+
359
+ const comparisonResult = Parser.compareFullDtoSequence(this.workingCopy, incomingFullDto);
360
+
361
+ return comparisonResult === Parser.loci.USE_INCOMING;
362
+ }
247
363
 
248
364
  /**
249
365
  * Compares Locus sequences
@@ -255,8 +371,8 @@ export default class Parser {
255
371
  // Locus sequence comparison rules in order of priority.
256
372
  // https://sqbu-github.cisco.com/WebExSquared/cloud-apps/wiki/Locus-Sequence-Comparison-Algorithm
257
373
 
258
- const local = Parser.getMetaData(current);
259
- const delta = Parser.getMetaData(incoming);
374
+ const local: any = Parser.getMetaData(current);
375
+ const delta: any = Parser.getMetaData(incoming);
260
376
 
261
377
  // update loci metadata
262
378
  local.unique = Parser.getUniqueSequences(local, delta);
@@ -268,7 +384,7 @@ export default class Parser {
268
384
  Parser.checkSequenceOverlap,
269
385
  Parser.checkUnequalRanges,
270
386
  Parser.checkForUniqueEntries,
271
- Parser.checkIfOutOfSync
387
+ Parser.checkIfOutOfSync,
272
388
  ];
273
389
 
274
390
  for (const rule of rules) {
@@ -287,16 +403,13 @@ export default class Parser {
287
403
  return Parser.loci.ERROR;
288
404
  }
289
405
 
290
-
291
406
  /**
292
407
  * Transates the result of a sequence comparison into an intended behavior
293
408
  * @param {string} result
294
409
  * @returns {string} Locus comparison action
295
410
  */
296
- static compareToAction(result) {
297
- const {
298
- DESYNC, EQ, ERROR, GT, LT, USE_CURRENT, USE_INCOMING
299
- } = Parser.loci;
411
+ static compareToAction(result: string) {
412
+ const {DESYNC, EQ, ERROR, GT, LT, USE_CURRENT, USE_INCOMING} = Parser.loci;
300
413
 
301
414
  let action = ERROR;
302
415
 
@@ -312,23 +425,23 @@ export default class Parser {
312
425
  action = DESYNC;
313
426
  break;
314
427
  default:
315
- LoggerProxy.logger.info(`Locus-info:parser#compareToAction --> Error: ${result} is not a recognized sequence comparison result.`);
428
+ LoggerProxy.logger.info(
429
+ `Locus-info:parser#compareToAction --> Error: ${result} is not a recognized sequence comparison result.`
430
+ );
316
431
  }
317
432
 
318
433
  return action;
319
434
  }
320
435
 
321
-
322
436
  /**
323
437
  * Extracts a loci comparison from a string of data.
324
438
  * @param {string} lociComparisonResult Comparison result with extra data
325
439
  * @returns {string} Comparison of EQ, LT, GT, or DESYNC.
326
440
  */
327
- static extractComparisonState(lociComparisonResult) {
441
+ static extractComparisonState(lociComparisonResult: string) {
328
442
  return lociComparisonResult.split(':')[0];
329
443
  }
330
444
 
331
-
332
445
  /**
333
446
  * @typedef {object} LociMetadata
334
447
  * @property {number} start - Starting sequence number
@@ -345,7 +458,7 @@ export default class Parser {
345
458
  * @param {Array.<number>} sequence Locus delta sequence
346
459
  * @returns {LociMetadata} Locus Delta Metadata
347
460
  */
348
- static getMetaData(sequence) {
461
+ static getMetaData(sequence: any) {
349
462
  const {entries} = sequence;
350
463
  const first = entries[0];
351
464
  const last = entries.slice(-1)[0];
@@ -365,11 +478,10 @@ export default class Parser {
365
478
  // Grab last entry if exist else default to rangeEnd
366
479
  max: last || end,
367
480
  // keep reference to actual sequence entries
368
- entries
481
+ entries,
369
482
  };
370
483
  }
371
484
 
372
-
373
485
  /**
374
486
  * Compares two Locus delta objects and notes unique
375
487
  * values contained within baseLoci.
@@ -377,17 +489,14 @@ export default class Parser {
377
489
  * @param {LociMetadata} otherLoci
378
490
  * @returns {Array.<number>} List of unique sequences
379
491
  */
380
- static getUniqueSequences(baseLoci, otherLoci) {
381
- const diff = difference(
382
- baseLoci.entries,
383
- otherLoci.entries
384
- );
492
+ static getUniqueSequences(baseLoci: any, otherLoci: any) {
493
+ const diff: any = difference(baseLoci.entries, otherLoci.entries);
494
+
385
495
  const {start, end} = otherLoci;
386
496
 
387
497
  return Parser.getNumbersOutOfRange(diff, start, end);
388
498
  }
389
499
 
390
-
391
500
  /**
392
501
  * Returns an array of numbers outside of a given range.
393
502
  * @param {Array.<number>} list Array to filter
@@ -395,7 +504,7 @@ export default class Parser {
395
504
  * @param {number} rangeEnd End of range
396
505
  * @returns {Array.<number>} Array of numbers sorted ASC
397
506
  */
398
- static getNumbersOutOfRange(list, rangeStart, rangeEnd) {
507
+ static getNumbersOutOfRange(list: Array<number>, rangeStart: number, rangeEnd: number) {
399
508
  // Collect all numbers if number is outside of specified range
400
509
  const output = list.filter((num) => num < rangeStart || num > rangeEnd);
401
510
 
@@ -403,7 +512,6 @@ export default class Parser {
403
512
  return output.sort((a, b) => a - b);
404
513
  }
405
514
 
406
-
407
515
  /**
408
516
  * Checks if newLoci or workingCopy is invalid.
409
517
  * @param {Types~Locus} newLoci
@@ -411,23 +519,23 @@ export default class Parser {
411
519
  */
412
520
  isValidLocus(newLoci) {
413
521
  let isValid = false;
414
- const {IDLE} = Parser.status;
415
522
  const {isLoci} = Parser;
416
- const setStatus = (status) => { this.status = status; };
417
523
 
418
524
  // one or both objects are not locus delta events
419
525
  if (!isLoci(this.workingCopy) || !isLoci(newLoci)) {
420
- setStatus(IDLE);
421
- LoggerProxy.logger.info('Locus-info:parser#processDeltaEvent --> Ignoring non-locus object. workingCopy:', this.workingCopy, 'newLoci:', newLoci);
422
- }
423
- else {
526
+ LoggerProxy.logger.info(
527
+ 'Locus-info:parser#processDeltaEvent --> Ignoring non-locus object. workingCopy:',
528
+ this.workingCopy,
529
+ 'newLoci:',
530
+ newLoci
531
+ );
532
+ } else {
424
533
  isValid = true;
425
534
  }
426
535
 
427
536
  return isValid;
428
537
  }
429
538
 
430
-
431
539
  /**
432
540
  * Determines if a paricular locus's sequence is empty
433
541
  * @param {Types~Locus} locus
@@ -441,7 +549,6 @@ export default class Parser {
441
549
  return hasEmptyEntries && hasEmptyRange;
442
550
  }
443
551
 
444
-
445
552
  /**
446
553
  * Determines if an object has basic
447
554
  * structure of a locus object.
@@ -452,8 +559,7 @@ export default class Parser {
452
559
  if (!loci || !loci.sequence) {
453
560
  return false;
454
561
  }
455
- const hasProp = (prop) =>
456
- Object.prototype.hasOwnProperty.call(loci.sequence, prop);
562
+ const hasProp = (prop) => Object.prototype.hasOwnProperty.call(loci.sequence, prop);
457
563
 
458
564
  if (hasProp('rangeStart') && hasProp('rangeEnd')) {
459
565
  return true;
@@ -468,22 +574,28 @@ export default class Parser {
468
574
  * @returns {undefined}
469
575
  */
470
576
  nextEvent() {
471
- if (this.status === Parser.status.PAUSED) {
577
+ if (this.status === 'PAUSED') {
472
578
  LoggerProxy.logger.info('Locus-info:parser#nextEvent --> Locus parser paused.');
473
579
 
474
580
  return;
475
581
  }
476
582
 
583
+ if (this.status === 'BLOCKED') {
584
+ LoggerProxy.logger.info(
585
+ 'Locus-info:parser#nextEvent --> Locus parser blocked by out-of-order delta.'
586
+ );
587
+
588
+ return;
589
+ }
590
+
477
591
  // continue processing until queue is empty
478
592
  if (this.queue.size() > 0) {
479
593
  this.processDeltaEvent();
480
- }
481
- else {
482
- this.status = Parser.status.IDLE;
594
+ } else {
595
+ this.status = 'IDLE';
483
596
  }
484
597
  }
485
598
 
486
-
487
599
  /**
488
600
  * Function handler for delta actions,
489
601
  * is set by instance callee.
@@ -491,9 +603,8 @@ export default class Parser {
491
603
  * @param {Types~Locus} locus Locus delta
492
604
  * @returns {undefined}
493
605
  */
494
- // eslint-disable-next-line no-unused-vars
495
- onDeltaAction(action, locus) {}
496
-
606
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
607
+ onDeltaAction(action: string, locus) {}
497
608
 
498
609
  /**
499
610
  * Event handler for locus delta events
@@ -503,37 +614,86 @@ export default class Parser {
503
614
  onDeltaEvent(loci) {
504
615
  // enqueue the new loci
505
616
  this.queue.enqueue(loci);
506
- // start processing events in the queue if idle
507
- // and a function handler is defined
508
- if (this.status === Parser.status.IDLE && this.onDeltaAction) {
509
- // Update status, ensure we only process one event at a time.
510
- this.status = Parser.status.WORKING;
511
617
 
512
- this.processDeltaEvent();
618
+ if (this.onDeltaAction) {
619
+ if (this.status === 'BLOCKED') {
620
+ if (this.queue.size() > MAX_OOO_DELTA_COUNT) {
621
+ this.triggerSync('queue too big, blocked on out-of-order delta');
622
+ } else {
623
+ this.processDeltaEvent();
624
+ }
625
+ } else if (this.status === 'IDLE') {
626
+ // Update status, ensure we only process one event at a time.
627
+ this.status = 'WORKING';
628
+
629
+ this.processDeltaEvent();
630
+ }
513
631
  }
514
632
  }
515
633
 
516
-
517
634
  /**
518
635
  * Appends new data onto a string of existing data.
519
636
  * @param {string} newData
520
637
  * @param {string} oldData
521
638
  * @returns {string}
522
639
  */
523
- static packComparisonResult(newData, oldData) {
640
+ static packComparisonResult(newData: string, oldData: string) {
524
641
  return `${newData}:${oldData}`;
525
642
  }
526
643
 
527
-
528
644
  /**
529
645
  * Pause locus processing
530
646
  * @returns {undefined}
531
647
  */
532
648
  pause() {
533
- this.status = Parser.status.PAUSED;
649
+ this.status = 'PAUSED';
534
650
  LoggerProxy.logger.info('Locus-info:parser#pause --> Locus parser paused.');
535
651
  }
536
652
 
653
+ /**
654
+ * Triggers a sync with Locus
655
+ *
656
+ * @param {string} reason used just for logging
657
+ * @returns {undefined}
658
+ */
659
+ private triggerSync(reason: string) {
660
+ LoggerProxy.logger.info(`Locus-info:parser#triggerSync --> doing sync, reason: ${reason}`);
661
+ this.stopSyncTimer();
662
+ this.pause();
663
+ this.onDeltaAction(Parser.loci.DESYNC, this.workingCopy);
664
+ }
665
+
666
+ /**
667
+ * Starts a timer with a random delay. When that timer expires we will do a sync.
668
+ *
669
+ * The main purpose of this timer is to handle a case when we get some out-of-order deltas,
670
+ * so we start waiting to receive the missing delta. If that delta never arrives, this timer
671
+ * will trigger a sync with Locus.
672
+ *
673
+ * @returns {undefined}
674
+ */
675
+ private startSyncTimer() {
676
+ if (this.syncTimer === undefined) {
677
+ const timeout = OOO_DELTA_WAIT_TIME + Math.random() * OOO_DELTA_WAIT_TIME_RANDOM_DELAY;
678
+
679
+ this.syncTimer = setTimeout(() => {
680
+ this.syncTimer = undefined;
681
+ this.triggerSync('timer expired, blocked on out-of-order delta');
682
+ }, timeout);
683
+ }
684
+ }
685
+
686
+ /**
687
+ * Stops the timer for triggering a sync
688
+ *
689
+ * @returns {undefined}
690
+ */
691
+ private stopSyncTimer() {
692
+ if (this.syncTimer !== undefined) {
693
+ clearTimeout(this.syncTimer);
694
+ this.syncTimer = undefined;
695
+ }
696
+ }
537
697
 
538
698
  /**
539
699
  * Processes next locus delta in the queue,
@@ -542,11 +702,13 @@ export default class Parser {
542
702
  * @returns {undefined}
543
703
  */
544
704
  processDeltaEvent() {
545
- const {DESYNC, USE_INCOMING} = Parser.loci;
705
+ const {DESYNC, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = Parser.loci;
546
706
  const {extractComparisonState: extract} = Parser;
547
707
  const newLoci = this.queue.dequeue();
548
708
 
549
709
  if (!this.isValidLocus(newLoci)) {
710
+ this.nextEvent();
711
+
550
712
  return;
551
713
  }
552
714
 
@@ -557,51 +719,88 @@ export default class Parser {
557
719
  // for full debugging.
558
720
  LoggerProxy.logger.debug(`Locus-info:parser#processDeltaEvent --> Locus Debug: ${result}`);
559
721
 
560
- if (lociComparison === DESYNC) {
561
- // wait for desync response
562
- this.pause();
722
+ let needToWait = false;
723
+
724
+ switch (lociComparison) {
725
+ case DESYNC:
726
+ // wait for desync response
727
+ this.pause();
728
+ break;
729
+
730
+ case USE_INCOMING:
731
+ case LOCUS_URL_CHANGED:
732
+ // update working copy for future comparisons.
733
+ // Note: The working copy of parser gets updated in .onFullLocus()
734
+ // and here when USE_INCOMING or LOCUS_URL_CHANGED locus.
735
+ this.workingCopy = newLoci;
736
+ break;
737
+
738
+ case WAIT:
739
+ // we've taken newLoci from the front of the queue, so put it back there as we have to wait
740
+ // for the one that should be in front of it, before we can process it
741
+ this.queue.enqueue(newLoci);
742
+ needToWait = true;
743
+ break;
744
+
745
+ default:
746
+ break;
563
747
  }
564
- else if (lociComparison === USE_INCOMING) {
565
- // update working copy for future comparisons.
566
- // Note: The working copy of parser gets updated in .onFullLocus()
567
- // and here when USE_INCOMING locus.
568
- this.workingCopy = newLoci;
748
+
749
+ if (needToWait) {
750
+ this.status = 'BLOCKED';
751
+ this.startSyncTimer();
752
+ } else {
753
+ this.stopSyncTimer();
754
+
755
+ if (this.status === 'BLOCKED') {
756
+ // we are not blocked anymore
757
+ this.status = 'WORKING';
758
+
759
+ LoggerProxy.logger.info(
760
+ `Locus-info:parser#processDeltaEvent --> received delta that we were waiting for ${Parser.locus2string(
761
+ newLoci
762
+ )}, not blocked anymore`
763
+ );
764
+ }
569
765
  }
570
766
 
571
767
  if (this.onDeltaAction) {
572
- LoggerProxy.logger.info(`Locus-info:parser#processDeltaEvent --> Locus Delta Action: ${lociComparison}`);
573
- this.onDeltaAction.call(this, lociComparison, newLoci);
768
+ LoggerProxy.logger.info(
769
+ `Locus-info:parser#processDeltaEvent --> Locus Delta ${Parser.locus2string(
770
+ newLoci
771
+ )}, Action: ${lociComparison}`
772
+ );
773
+
774
+ this.onDeltaAction(lociComparison, newLoci);
574
775
  }
575
776
 
576
777
  this.nextEvent();
577
778
  }
578
779
 
579
-
580
780
  /**
581
781
  * Resume from a paused state
582
782
  * @returns {undefined}
583
783
  */
584
784
  resume() {
585
785
  LoggerProxy.logger.info('Locus-info:parser#resume --> Locus parser resumed.');
586
- this.status = Parser.status.WORKING;
786
+ this.status = 'WORKING';
587
787
  this.nextEvent();
588
788
  }
589
789
 
590
-
591
790
  /**
592
791
  * Gets related debug info for given error code
593
792
  * @param {string} debugCode Debug code
594
793
  * @param {string} comparison Locus comparison string
595
794
  * @returns {object} Debug message
596
795
  */
597
- static getDebugMessage(debugCode, comparison) {
796
+ static getDebugMessage(debugCode: string, comparison: string) {
598
797
  // removes extra spaces from multiline string
599
798
  const mStr = (strings) => strings.join('').replace(/\s{2,}/g, ' ');
600
799
 
601
800
  const resolutionMap = {
602
801
  EQ: `${Parser.loci.LT}: is equal (current == incoming).`,
603
802
  LT: `${Parser.loci.LT}: choose right side (incoming).`,
604
- GT: `${Parser.loci.GT}: choose left side (current).`
803
+ GT: `${Parser.loci.GT}: choose left side (current).`,
605
804
  };
606
805
 
607
806
  const debugMap = {
@@ -609,28 +808,28 @@ export default class Parser {
609
808
  title: 'checkSequenceOverlap-001',
610
809
  description: mStr`Occurs if earliest working copy sequence is more \
611
810
  recent than last incoming sequence.`,
612
- logic: 'current.min > incoming.max'
811
+ logic: 'current.min > incoming.max',
613
812
  },
614
813
 
615
814
  SO002: {
616
815
  title: 'checkSequenceOverlap-002',
617
816
  description: mStr`Occurs if last working copy sequence is before the \
618
817
  earliest incoming sequence.`,
619
- logic: 'current.max < incoming.min'
818
+ logic: 'current.max < incoming.min',
620
819
  },
621
820
 
622
821
  UR001: {
623
822
  title: 'checkUnequalRanges-001',
624
823
  description: mStr`Occurs if there are no unique values for both loci, \
625
824
  and the current working copy loci has a larger range.`,
626
- logic: 'currentTotalRange > incomingTotalRange'
825
+ logic: 'currentTotalRange > incomingTotalRange',
627
826
  },
628
827
 
629
828
  UR002: {
630
829
  title: 'checkUnequalRanges-002',
631
830
  description: mStr`Occurs if there are no unique values for both loci, \
632
831
  and the incoming delta loci has a larger range.`,
633
- logic: 'currentTotalRange < incomingTotalRange'
832
+ logic: 'currentTotalRange < incomingTotalRange',
634
833
  },
635
834
 
636
835
  UR003: {
@@ -638,7 +837,7 @@ export default class Parser {
638
837
  description: mStr`Occurs if there are no unique values for both loci, \
639
838
  and with ranges either absent or of the same size, the sequences \
640
839
  are considered equal.`,
641
- logic: 'currentTotalRange == incomingTotalRange'
840
+ logic: 'currentTotalRange == incomingTotalRange',
642
841
  },
643
842
 
644
843
  UE001: {
@@ -646,7 +845,7 @@ export default class Parser {
646
845
  description: mStr`Occurs if current loci has unique entries and \
647
846
  incoming does not. Entries are considered unique if they \
648
847
  do not overlap with other Loci sequences or range values.`,
649
- logic: 'currentIsUnique && !incomingIsUnique'
848
+ logic: 'currentIsUnique && !incomingIsUnique',
650
849
  },
651
850
 
652
851
  UE002: {
@@ -654,7 +853,7 @@ export default class Parser {
654
853
  description: mStr`Occurs if current has no unique entries but \
655
854
  incoming does. Entries are considered unique if they \
656
855
  do not overlap with other Loci sequences or range values.`,
657
- logic: '!currentIsUnique && incomingIsUnique'
856
+ logic: '!currentIsUnique && incomingIsUnique',
658
857
  },
659
858
 
660
859
  OOS001: {
@@ -663,7 +862,7 @@ export default class Parser {
663
862
  if the current loci unique entries overlap the total range of the \
664
863
  incoming sequence, or if the incoming unique entries overlap \
665
864
  the total range of current sequence.`,
666
- logic: 'neitherSeqHasRange || currentUniqOverlap || incomingUniqOverlap'
865
+ logic: 'neitherSeqHasRange || currentUniqOverlap || incomingUniqOverlap',
667
866
  },
668
867
 
669
868
  OOS002: {
@@ -671,15 +870,15 @@ export default class Parser {
671
870
  description: mStr`Occurs if the minimum value from sequences that are \
672
871
  unique to the current loci is greater than the minimum value from \
673
872
  sequences that are unique to the incoming loci.`,
674
- logic: 'currentUniqueMin > incomingUniqueMin'
873
+ logic: 'currentUniqueMin > incomingUniqueMin',
675
874
  },
676
875
 
677
876
  OOS003: {
678
877
  title: 'checkIfOutOfSync-003',
679
878
  description: mStr`Occurs if none of the comparison rules applied. \
680
879
  It is a catch all.`,
681
- logic: 'else (catch all)'
682
- }
880
+ logic: 'else (catch all)',
881
+ },
683
882
  };
684
883
 
685
884
  const debugObj = debugMap[debugCode];