@webex/plugin-meetings 2.60.0 → 2.60.1-next.1

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 (535) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.d.ts +42 -0
  3. package/dist/annotation/annotation.types.js +7 -0
  4. package/dist/annotation/annotation.types.js.map +1 -0
  5. package/dist/annotation/constants.d.ts +31 -0
  6. package/dist/annotation/constants.js +41 -0
  7. package/dist/annotation/constants.js.map +1 -0
  8. package/dist/annotation/index.d.ts +117 -0
  9. package/dist/annotation/index.js +357 -0
  10. package/dist/annotation/index.js.map +1 -0
  11. package/dist/breakouts/breakout.d.ts +8 -0
  12. package/dist/breakouts/breakout.js +215 -0
  13. package/dist/breakouts/breakout.js.map +1 -0
  14. package/dist/breakouts/collection.d.ts +5 -0
  15. package/dist/breakouts/collection.js +22 -0
  16. package/dist/breakouts/collection.js.map +1 -0
  17. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  18. package/dist/breakouts/edit-lock-error.js +51 -0
  19. package/dist/breakouts/edit-lock-error.js.map +1 -0
  20. package/dist/breakouts/events.d.ts +8 -0
  21. package/dist/breakouts/events.js +44 -0
  22. package/dist/breakouts/events.js.map +1 -0
  23. package/dist/breakouts/index.d.ts +5 -0
  24. package/dist/breakouts/index.js +1047 -0
  25. package/dist/breakouts/index.js.map +1 -0
  26. package/dist/breakouts/request.d.ts +22 -0
  27. package/dist/breakouts/request.js +77 -0
  28. package/dist/breakouts/request.js.map +1 -0
  29. package/dist/breakouts/utils.d.ts +15 -0
  30. package/dist/breakouts/utils.js +64 -0
  31. package/dist/breakouts/utils.js.map +1 -0
  32. package/dist/common/browser-detection.js +2 -3
  33. package/dist/common/browser-detection.js.map +1 -1
  34. package/dist/common/collection.js +3 -4
  35. package/dist/common/collection.js.map +1 -1
  36. package/dist/common/config.js +1 -2
  37. package/dist/common/config.js.map +1 -1
  38. package/dist/common/errors/captcha-error.js +1 -2
  39. package/dist/common/errors/captcha-error.js.map +1 -1
  40. package/dist/common/errors/intent-to-join.js +1 -2
  41. package/dist/common/errors/intent-to-join.js.map +1 -1
  42. package/dist/common/errors/join-meeting.js +1 -2
  43. package/dist/common/errors/join-meeting.js.map +1 -1
  44. package/dist/common/errors/media.js +1 -2
  45. package/dist/common/errors/media.js.map +1 -1
  46. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  47. package/dist/common/errors/no-meeting-info.js +50 -0
  48. package/dist/common/errors/no-meeting-info.js.map +1 -0
  49. package/dist/common/errors/parameter.js +3 -4
  50. package/dist/common/errors/parameter.js.map +1 -1
  51. package/dist/common/errors/password-error.js +1 -2
  52. package/dist/common/errors/password-error.js.map +1 -1
  53. package/dist/common/errors/permission.js +1 -2
  54. package/dist/common/errors/permission.js.map +1 -1
  55. package/dist/common/errors/{reclaim-host-role-error.js → reclaim-host-role-errors.js} +7 -11
  56. package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
  57. package/dist/common/errors/reconnection-in-progress.js +1 -2
  58. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  59. package/dist/common/errors/reconnection.js +1 -2
  60. package/dist/common/errors/reconnection.js.map +1 -1
  61. package/dist/common/errors/stats.js +1 -2
  62. package/dist/common/errors/stats.js.map +1 -1
  63. package/dist/common/errors/webex-errors.d.ts +20 -8
  64. package/dist/common/errors/webex-errors.js +48 -28
  65. package/dist/common/errors/webex-errors.js.map +1 -1
  66. package/dist/common/errors/webex-meetings-error.js +1 -2
  67. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  68. package/dist/common/events/events-scope.js +1 -2
  69. package/dist/common/events/events-scope.js.map +1 -1
  70. package/dist/common/events/events.js +1 -2
  71. package/dist/common/events/events.js.map +1 -1
  72. package/dist/common/events/trigger-proxy.js +1 -2
  73. package/dist/common/events/trigger-proxy.js.map +1 -1
  74. package/dist/common/events/util.js +1 -2
  75. package/dist/common/events/util.js.map +1 -1
  76. package/dist/common/logs/logger-config.js +1 -2
  77. package/dist/common/logs/logger-config.js.map +1 -1
  78. package/dist/common/logs/logger-proxy.js +2 -3
  79. package/dist/common/logs/logger-proxy.js.map +1 -1
  80. package/dist/common/logs/request.d.ts +3 -1
  81. package/dist/common/logs/request.js +8 -5
  82. package/dist/common/logs/request.js.map +1 -1
  83. package/dist/common/queue.d.ts +9 -7
  84. package/dist/common/queue.js +22 -9
  85. package/dist/common/queue.js.map +1 -1
  86. package/dist/config.d.ts +6 -7
  87. package/dist/config.js +8 -10
  88. package/dist/config.js.map +1 -1
  89. package/dist/constants.d.ts +217 -97
  90. package/dist/constants.js +416 -441
  91. package/dist/constants.js.map +1 -1
  92. package/dist/controls-options-manager/constants.js +3 -6
  93. package/dist/controls-options-manager/constants.js.map +1 -1
  94. package/dist/controls-options-manager/enums.d.ts +11 -1
  95. package/dist/controls-options-manager/enums.js +15 -6
  96. package/dist/controls-options-manager/enums.js.map +1 -1
  97. package/dist/controls-options-manager/index.d.ts +17 -1
  98. package/dist/controls-options-manager/index.js +127 -38
  99. package/dist/controls-options-manager/index.js.map +1 -1
  100. package/dist/controls-options-manager/types.d.ts +43 -0
  101. package/dist/controls-options-manager/types.js +7 -0
  102. package/dist/controls-options-manager/types.js.map +1 -0
  103. package/dist/controls-options-manager/util.d.ts +1 -7
  104. package/dist/controls-options-manager/util.js +309 -19
  105. package/dist/controls-options-manager/util.js.map +1 -1
  106. package/dist/index.d.ts +6 -3
  107. package/dist/index.js +121 -5
  108. package/dist/index.js.map +1 -1
  109. package/dist/interceptors/index.d.ts +2 -0
  110. package/dist/interceptors/index.js +15 -0
  111. package/dist/interceptors/index.js.map +1 -0
  112. package/dist/interceptors/locusRetry.d.ts +27 -0
  113. package/dist/interceptors/locusRetry.js +94 -0
  114. package/dist/interceptors/locusRetry.js.map +1 -0
  115. package/dist/interpretation/collection.d.ts +5 -0
  116. package/dist/interpretation/collection.js +22 -0
  117. package/dist/interpretation/collection.js.map +1 -0
  118. package/dist/interpretation/index.d.ts +5 -0
  119. package/dist/interpretation/index.js +365 -0
  120. package/dist/interpretation/index.js.map +1 -0
  121. package/dist/interpretation/siLanguage.d.ts +5 -0
  122. package/dist/interpretation/siLanguage.js +24 -0
  123. package/dist/interpretation/siLanguage.js.map +1 -0
  124. package/dist/locus-info/controlsUtils.js +100 -11
  125. package/dist/locus-info/controlsUtils.js.map +1 -1
  126. package/dist/locus-info/embeddedAppsUtils.js +3 -4
  127. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  128. package/dist/locus-info/fullState.js +1 -2
  129. package/dist/locus-info/fullState.js.map +1 -1
  130. package/dist/locus-info/hostUtils.js +1 -2
  131. package/dist/locus-info/hostUtils.js.map +1 -1
  132. package/dist/locus-info/index.d.ts +57 -4
  133. package/dist/locus-info/index.js +425 -84
  134. package/dist/locus-info/index.js.map +1 -1
  135. package/dist/locus-info/infoUtils.js +13 -5
  136. package/dist/locus-info/infoUtils.js.map +1 -1
  137. package/dist/locus-info/mediaSharesUtils.js +58 -3
  138. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  139. package/dist/locus-info/parser.d.ts +66 -6
  140. package/dist/locus-info/parser.js +253 -80
  141. package/dist/locus-info/parser.js.map +1 -1
  142. package/dist/locus-info/selfUtils.js +97 -13
  143. package/dist/locus-info/selfUtils.js.map +1 -1
  144. package/dist/media/index.d.ts +2 -0
  145. package/dist/media/index.js +107 -319
  146. package/dist/media/index.js.map +1 -1
  147. package/dist/media/properties.d.ts +38 -53
  148. package/dist/media/properties.js +96 -153
  149. package/dist/media/properties.js.map +1 -1
  150. package/dist/media/util.js +1 -22
  151. package/dist/media/util.js.map +1 -1
  152. package/dist/mediaQualityMetrics/config.d.ts +234 -230
  153. package/dist/mediaQualityMetrics/config.js +302 -498
  154. package/dist/mediaQualityMetrics/config.js.map +1 -1
  155. package/dist/meeting/in-meeting-actions.d.ts +88 -0
  156. package/dist/meeting/in-meeting-actions.js +94 -3
  157. package/dist/meeting/in-meeting-actions.js.map +1 -1
  158. package/dist/meeting/index.d.ts +591 -494
  159. package/dist/meeting/index.js +4732 -2990
  160. package/dist/meeting/index.js.map +1 -1
  161. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  162. package/dist/meeting/locusMediaRequest.js +291 -0
  163. package/dist/meeting/locusMediaRequest.js.map +1 -0
  164. package/dist/meeting/muteState.d.ts +93 -25
  165. package/dist/meeting/muteState.js +224 -133
  166. package/dist/meeting/muteState.js.map +1 -1
  167. package/dist/meeting/request.d.ts +82 -47
  168. package/dist/meeting/request.js +297 -199
  169. package/dist/meeting/request.js.map +1 -1
  170. package/dist/meeting/request.type.d.ts +11 -0
  171. package/dist/meeting/request.type.js +7 -0
  172. package/dist/meeting/request.type.js.map +1 -0
  173. package/dist/meeting/state.js +1 -2
  174. package/dist/meeting/state.js.map +1 -1
  175. package/dist/meeting/util.d.ts +102 -1
  176. package/dist/meeting/util.js +605 -435
  177. package/dist/meeting/util.js.map +1 -1
  178. package/dist/meeting-info/collection.js +3 -4
  179. package/dist/meeting-info/collection.js.map +1 -1
  180. package/dist/meeting-info/index.d.ts +13 -1
  181. package/dist/meeting-info/index.js +74 -7
  182. package/dist/meeting-info/index.js.map +1 -1
  183. package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
  184. package/dist/meeting-info/meeting-info-v2.js +200 -63
  185. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  186. package/dist/meeting-info/request.js +1 -2
  187. package/dist/meeting-info/request.js.map +1 -1
  188. package/dist/meeting-info/util.js +2 -3
  189. package/dist/meeting-info/util.js.map +1 -1
  190. package/dist/meeting-info/utilv2.js +39 -41
  191. package/dist/meeting-info/utilv2.js.map +1 -1
  192. package/dist/meetings/collection.d.ts +17 -0
  193. package/dist/meetings/collection.js +42 -4
  194. package/dist/meetings/collection.js.map +1 -1
  195. package/dist/meetings/index.d.ts +93 -21
  196. package/dist/meetings/index.js +490 -127
  197. package/dist/meetings/index.js.map +1 -1
  198. package/dist/meetings/meetings.types.d.ts +4 -0
  199. package/dist/meetings/meetings.types.js +7 -0
  200. package/dist/meetings/meetings.types.js.map +1 -0
  201. package/dist/meetings/request.js +4 -3
  202. package/dist/meetings/request.js.map +1 -1
  203. package/dist/meetings/util.js +107 -6
  204. package/dist/meetings/util.js.map +1 -1
  205. package/dist/member/index.d.ts +13 -1
  206. package/dist/member/index.js +45 -2
  207. package/dist/member/index.js.map +1 -1
  208. package/dist/member/member.types.js +3 -4
  209. package/dist/member/member.types.js.map +1 -1
  210. package/dist/member/types.d.ts +32 -0
  211. package/dist/member/types.js +23 -0
  212. package/dist/member/types.js.map +1 -0
  213. package/dist/member/util.js +120 -29
  214. package/dist/member/util.js.map +1 -1
  215. package/dist/members/collection.d.ts +5 -0
  216. package/dist/members/collection.js +11 -2
  217. package/dist/members/collection.js.map +1 -1
  218. package/dist/members/index.d.ts +56 -11
  219. package/dist/members/index.js +174 -47
  220. package/dist/members/index.js.map +1 -1
  221. package/dist/members/request.d.ts +67 -11
  222. package/dist/members/request.js +102 -54
  223. package/dist/members/request.js.map +1 -1
  224. package/dist/members/types.js +3 -4
  225. package/dist/members/types.js.map +1 -1
  226. package/dist/members/util.d.ts +214 -1
  227. package/dist/members/util.js +327 -284
  228. package/dist/members/util.js.map +1 -1
  229. package/dist/metrics/constants.d.ts +15 -6
  230. package/dist/metrics/constants.js +17 -9
  231. package/dist/metrics/constants.js.map +1 -1
  232. package/dist/metrics/index.d.ts +4 -111
  233. package/dist/metrics/index.js +4 -452
  234. package/dist/metrics/index.js.map +1 -1
  235. package/dist/multistream/mediaRequestManager.d.ts +118 -0
  236. package/dist/multistream/mediaRequestManager.js +344 -0
  237. package/dist/multistream/mediaRequestManager.js.map +1 -0
  238. package/dist/multistream/receiveSlot.d.ts +68 -0
  239. package/dist/multistream/receiveSlot.js +200 -0
  240. package/dist/multistream/receiveSlot.js.map +1 -0
  241. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  242. package/dist/multistream/receiveSlotManager.js +174 -0
  243. package/dist/multistream/receiveSlotManager.js.map +1 -0
  244. package/dist/multistream/remoteMedia.d.ts +72 -0
  245. package/dist/multistream/remoteMedia.js +268 -0
  246. package/dist/multistream/remoteMedia.js.map +1 -0
  247. package/dist/multistream/remoteMediaGroup.d.ts +47 -0
  248. package/dist/multistream/remoteMediaGroup.js +267 -0
  249. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  250. package/dist/multistream/remoteMediaManager.d.ts +285 -0
  251. package/dist/multistream/remoteMediaManager.js +1211 -0
  252. package/dist/multistream/remoteMediaManager.js.map +1 -0
  253. package/dist/multistream/sendSlotManager.d.ts +61 -0
  254. package/dist/multistream/sendSlotManager.js +236 -0
  255. package/dist/multistream/sendSlotManager.js.map +1 -0
  256. package/dist/networkQualityMonitor/index.js +5 -4
  257. package/dist/networkQualityMonitor/index.js.map +1 -1
  258. package/dist/personal-meeting-room/index.js +2 -3
  259. package/dist/personal-meeting-room/index.js.map +1 -1
  260. package/dist/personal-meeting-room/request.js +2 -3
  261. package/dist/personal-meeting-room/request.js.map +1 -1
  262. package/dist/personal-meeting-room/util.js +1 -2
  263. package/dist/personal-meeting-room/util.js.map +1 -1
  264. package/dist/reachability/clusterReachability.d.ts +109 -0
  265. package/dist/reachability/clusterReachability.js +357 -0
  266. package/dist/reachability/clusterReachability.js.map +1 -0
  267. package/dist/reachability/index.d.ts +61 -95
  268. package/dist/reachability/index.js +300 -393
  269. package/dist/reachability/index.js.map +1 -1
  270. package/dist/reachability/request.d.ts +7 -3
  271. package/dist/reachability/request.js +18 -10
  272. package/dist/reachability/request.js.map +1 -1
  273. package/dist/reachability/util.d.ts +8 -0
  274. package/dist/reachability/util.js +29 -0
  275. package/dist/reachability/util.js.map +1 -0
  276. package/dist/reactions/constants.d.ts +3 -0
  277. package/dist/reactions/constants.js +12 -0
  278. package/dist/reactions/constants.js.map +1 -0
  279. package/dist/reactions/reactions.d.ts +2 -2
  280. package/dist/reactions/reactions.js +4 -6
  281. package/dist/reactions/reactions.js.map +1 -1
  282. package/dist/reactions/reactions.type.d.ts +23 -3
  283. package/dist/reactions/reactions.type.js +21 -23
  284. package/dist/reactions/reactions.type.js.map +1 -1
  285. package/dist/reconnection-manager/index.d.ts +32 -8
  286. package/dist/reconnection-manager/index.js +282 -231
  287. package/dist/reconnection-manager/index.js.map +1 -1
  288. package/dist/recording-controller/enums.js +4 -5
  289. package/dist/recording-controller/enums.js.map +1 -1
  290. package/dist/recording-controller/index.d.ts +15 -1
  291. package/dist/recording-controller/index.js +57 -46
  292. package/dist/recording-controller/index.js.map +1 -1
  293. package/dist/recording-controller/util.d.ts +5 -4
  294. package/dist/recording-controller/util.js +10 -10
  295. package/dist/recording-controller/util.js.map +1 -1
  296. package/dist/roap/index.d.ts +9 -47
  297. package/dist/roap/index.js +101 -235
  298. package/dist/roap/index.js.map +1 -1
  299. package/dist/roap/request.d.ts +18 -12
  300. package/dist/roap/request.js +126 -180
  301. package/dist/roap/request.js.map +1 -1
  302. package/dist/roap/turnDiscovery.d.ts +27 -16
  303. package/dist/roap/turnDiscovery.js +115 -105
  304. package/dist/roap/turnDiscovery.js.map +1 -1
  305. package/dist/rtcMetrics/constants.d.ts +4 -0
  306. package/dist/rtcMetrics/constants.js +11 -0
  307. package/dist/rtcMetrics/constants.js.map +1 -0
  308. package/dist/rtcMetrics/index.d.ts +54 -0
  309. package/dist/rtcMetrics/index.js +140 -0
  310. package/dist/rtcMetrics/index.js.map +1 -0
  311. package/dist/statsAnalyzer/global.d.ts +1 -83
  312. package/dist/statsAnalyzer/global.js +2 -85
  313. package/dist/statsAnalyzer/global.js.map +1 -1
  314. package/dist/statsAnalyzer/index.d.ts +50 -30
  315. package/dist/statsAnalyzer/index.js +435 -510
  316. package/dist/statsAnalyzer/index.js.map +1 -1
  317. package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
  318. package/dist/statsAnalyzer/mqaUtil.js +120 -83
  319. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  320. package/dist/transcription/index.js +1 -2
  321. package/dist/transcription/index.js.map +1 -1
  322. package/dist/webinar/collection.d.ts +16 -0
  323. package/dist/webinar/collection.js +43 -0
  324. package/dist/webinar/collection.js.map +1 -0
  325. package/dist/webinar/index.d.ts +5 -0
  326. package/dist/webinar/index.js +68 -0
  327. package/dist/webinar/index.js.map +1 -0
  328. package/package.json +38 -26
  329. package/src/annotation/annotation.types.ts +50 -0
  330. package/src/annotation/constants.ts +36 -0
  331. package/src/annotation/index.ts +328 -0
  332. package/src/breakouts/README.md +220 -0
  333. package/src/breakouts/breakout.ts +188 -0
  334. package/src/breakouts/collection.ts +19 -0
  335. package/src/breakouts/edit-lock-error.ts +25 -0
  336. package/src/breakouts/events.ts +56 -0
  337. package/src/breakouts/index.ts +925 -0
  338. package/src/breakouts/request.ts +55 -0
  339. package/src/breakouts/utils.ts +57 -0
  340. package/src/common/errors/no-meeting-info.ts +24 -0
  341. package/src/common/errors/webex-errors.ts +36 -12
  342. package/src/common/logs/logger-proxy.ts +1 -1
  343. package/src/common/logs/request.ts +5 -1
  344. package/src/common/queue.ts +22 -8
  345. package/src/config.ts +6 -7
  346. package/src/constants.ts +244 -97
  347. package/src/controls-options-manager/enums.ts +12 -0
  348. package/src/controls-options-manager/index.ts +116 -21
  349. package/src/controls-options-manager/types.ts +59 -0
  350. package/src/controls-options-manager/util.ts +294 -14
  351. package/src/index.ts +44 -0
  352. package/src/interceptors/index.ts +3 -0
  353. package/src/interceptors/locusRetry.ts +67 -0
  354. package/src/interpretation/README.md +60 -0
  355. package/src/interpretation/collection.ts +19 -0
  356. package/src/interpretation/index.ts +332 -0
  357. package/src/interpretation/siLanguage.ts +18 -0
  358. package/src/locus-info/controlsUtils.ts +110 -0
  359. package/src/locus-info/index.ts +449 -61
  360. package/src/locus-info/infoUtils.ts +14 -2
  361. package/src/locus-info/mediaSharesUtils.ts +64 -0
  362. package/src/locus-info/parser.ts +258 -47
  363. package/src/locus-info/selfUtils.ts +85 -2
  364. package/src/media/index.ts +153 -370
  365. package/src/media/properties.ts +106 -136
  366. package/src/media/util.ts +0 -21
  367. package/src/mediaQualityMetrics/config.ts +244 -377
  368. package/src/meeting/in-meeting-actions.ts +176 -0
  369. package/src/meeting/index.ts +3944 -2489
  370. package/src/meeting/locusMediaRequest.ts +313 -0
  371. package/src/meeting/muteState.ts +224 -138
  372. package/src/meeting/request.ts +207 -127
  373. package/src/meeting/request.type.ts +13 -0
  374. package/src/meeting/util.ts +590 -423
  375. package/src/meeting-info/index.ts +81 -8
  376. package/src/meeting-info/meeting-info-v2.ts +163 -13
  377. package/src/meeting-info/util.ts +1 -1
  378. package/src/meeting-info/utilv2.ts +28 -28
  379. package/src/meetings/collection.ts +33 -0
  380. package/src/meetings/index.ts +487 -126
  381. package/src/meetings/meetings.types.ts +12 -0
  382. package/src/meetings/request.ts +2 -0
  383. package/src/meetings/util.ts +116 -5
  384. package/src/member/index.ts +43 -1
  385. package/src/member/types.ts +38 -0
  386. package/src/member/util.ts +125 -28
  387. package/src/members/collection.ts +8 -0
  388. package/src/members/index.ts +187 -52
  389. package/src/members/request.ts +87 -27
  390. package/src/members/util.ts +332 -291
  391. package/src/metrics/constants.ts +15 -6
  392. package/src/metrics/index.ts +1 -471
  393. package/src/multistream/mediaRequestManager.ts +440 -0
  394. package/src/multistream/receiveSlot.ts +184 -0
  395. package/src/multistream/receiveSlotManager.ts +166 -0
  396. package/src/multistream/remoteMedia.ts +254 -0
  397. package/src/multistream/remoteMediaGroup.ts +284 -0
  398. package/src/multistream/remoteMediaManager.ts +1145 -0
  399. package/src/multistream/sendSlotManager.ts +170 -0
  400. package/src/networkQualityMonitor/index.ts +6 -6
  401. package/src/reachability/clusterReachability.ts +320 -0
  402. package/src/reachability/index.ts +243 -347
  403. package/src/reachability/request.ts +17 -8
  404. package/src/reachability/util.ts +24 -0
  405. package/src/reactions/constants.ts +4 -0
  406. package/src/reactions/reactions.ts +4 -4
  407. package/src/reactions/reactions.type.ts +30 -4
  408. package/src/reconnection-manager/index.ts +168 -156
  409. package/src/recording-controller/index.ts +20 -3
  410. package/src/recording-controller/util.ts +26 -9
  411. package/src/roap/index.ts +98 -241
  412. package/src/roap/request.ts +74 -148
  413. package/src/roap/turnDiscovery.ts +62 -56
  414. package/src/rtcMetrics/constants.ts +3 -0
  415. package/src/rtcMetrics/index.ts +124 -0
  416. package/src/statsAnalyzer/global.ts +1 -84
  417. package/src/statsAnalyzer/index.ts +477 -643
  418. package/src/statsAnalyzer/mqaUtil.ts +115 -114
  419. package/src/webinar/collection.ts +31 -0
  420. package/src/webinar/index.ts +62 -0
  421. package/test/integration/spec/converged-space-meetings.js +233 -0
  422. package/test/integration/spec/journey.js +320 -264
  423. package/test/integration/spec/space-meeting.js +77 -4
  424. package/test/unit/spec/annotation/index.ts +418 -0
  425. package/test/unit/spec/breakouts/breakout.ts +237 -0
  426. package/test/unit/spec/breakouts/collection.ts +15 -0
  427. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  428. package/test/unit/spec/breakouts/events.ts +89 -0
  429. package/test/unit/spec/breakouts/index.ts +1790 -0
  430. package/test/unit/spec/breakouts/request.ts +104 -0
  431. package/test/unit/spec/breakouts/utils.js +72 -0
  432. package/test/unit/spec/common/queue.js +31 -2
  433. package/test/unit/spec/controls-options-manager/index.js +163 -0
  434. package/test/unit/spec/controls-options-manager/util.js +576 -60
  435. package/test/unit/spec/fixture/locus.js +1 -0
  436. package/test/unit/spec/interceptors/locusRetry.ts +131 -0
  437. package/test/unit/spec/interpretation/collection.ts +15 -0
  438. package/test/unit/spec/interpretation/index.ts +589 -0
  439. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  440. package/test/unit/spec/locus-info/controlsUtils.js +323 -30
  441. package/test/unit/spec/locus-info/index.js +1390 -16
  442. package/test/unit/spec/locus-info/infoUtils.js +54 -16
  443. package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
  444. package/test/unit/spec/locus-info/lib/selfConstant.js +48 -0
  445. package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
  446. package/test/unit/spec/locus-info/parser.js +116 -35
  447. package/test/unit/spec/locus-info/selfUtils.js +275 -0
  448. package/test/unit/spec/media/index.ts +290 -0
  449. package/test/unit/spec/media/properties.ts +75 -84
  450. package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
  451. package/test/unit/spec/meeting/index.js +8187 -2769
  452. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  453. package/test/unit/spec/meeting/muteState.js +409 -213
  454. package/test/unit/spec/meeting/request.js +512 -42
  455. package/test/unit/spec/meeting/utils.js +741 -24
  456. package/test/unit/spec/meeting-info/index.js +300 -0
  457. package/test/unit/spec/meeting-info/meetinginfov2.js +527 -5
  458. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  459. package/test/unit/spec/meetings/collection.js +26 -0
  460. package/test/unit/spec/meetings/index.js +1313 -243
  461. package/test/unit/spec/meetings/utils.js +202 -2
  462. package/test/unit/spec/member/index.js +32 -9
  463. package/test/unit/spec/member/util.js +499 -61
  464. package/test/unit/spec/members/index.js +394 -5
  465. package/test/unit/spec/members/request.js +206 -27
  466. package/test/unit/spec/members/utils.js +173 -38
  467. package/test/unit/spec/metrics/index.js +1 -50
  468. package/test/unit/spec/multistream/mediaRequestManager.ts +1418 -0
  469. package/test/unit/spec/multistream/receiveSlot.ts +163 -0
  470. package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
  471. package/test/unit/spec/multistream/remoteMedia.ts +255 -0
  472. package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
  473. package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
  474. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  475. package/test/unit/spec/networkQualityMonitor/index.js +4 -4
  476. package/test/unit/spec/reachability/clusterReachability.ts +279 -0
  477. package/test/unit/spec/reachability/index.ts +531 -24
  478. package/test/unit/spec/reachability/request.js +68 -0
  479. package/test/unit/spec/reachability/util.ts +40 -0
  480. package/test/unit/spec/reconnection-manager/index.js +162 -24
  481. package/test/unit/spec/recording-controller/index.js +293 -218
  482. package/test/unit/spec/recording-controller/util.js +223 -96
  483. package/test/unit/spec/roap/index.ts +200 -76
  484. package/test/unit/spec/roap/request.ts +255 -0
  485. package/test/unit/spec/roap/turnDiscovery.ts +86 -48
  486. package/test/unit/spec/rtcMetrics/index.ts +93 -0
  487. package/test/unit/spec/stats-analyzer/index.js +261 -167
  488. package/test/unit/spec/webinar/collection.ts +13 -0
  489. package/test/unit/spec/webinar/index.ts +60 -0
  490. package/test/utils/constants.js +9 -0
  491. package/test/utils/integrationTestUtils.js +46 -0
  492. package/test/utils/testUtils.js +0 -45
  493. package/test/utils/webex-config.js +4 -0
  494. package/test/utils/webex-test-users.js +7 -3
  495. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  496. package/dist/meeting/effectsState.d.ts +0 -42
  497. package/dist/meeting/effectsState.js +0 -260
  498. package/dist/meeting/effectsState.js.map +0 -1
  499. package/dist/metrics/config.d.ts +0 -169
  500. package/dist/metrics/config.js +0 -289
  501. package/dist/metrics/config.js.map +0 -1
  502. package/dist/peer-connection-manager/index.d.ts +0 -6
  503. package/dist/peer-connection-manager/index.js +0 -671
  504. package/dist/peer-connection-manager/index.js.map +0 -1
  505. package/dist/peer-connection-manager/util.d.ts +0 -6
  506. package/dist/peer-connection-manager/util.js +0 -110
  507. package/dist/peer-connection-manager/util.js.map +0 -1
  508. package/dist/roap/collection.d.ts +0 -10
  509. package/dist/roap/collection.js +0 -63
  510. package/dist/roap/collection.js.map +0 -1
  511. package/dist/roap/handler.d.ts +0 -47
  512. package/dist/roap/handler.js +0 -279
  513. package/dist/roap/handler.js.map +0 -1
  514. package/dist/roap/state.d.ts +0 -9
  515. package/dist/roap/state.js +0 -127
  516. package/dist/roap/state.js.map +0 -1
  517. package/dist/roap/util.d.ts +0 -2
  518. package/dist/roap/util.js +0 -76
  519. package/dist/roap/util.js.map +0 -1
  520. package/src/index.js +0 -15
  521. package/src/meeting/effectsState.ts +0 -209
  522. package/src/metrics/config.ts +0 -485
  523. package/src/peer-connection-manager/index.ts +0 -847
  524. package/src/peer-connection-manager/util.ts +0 -119
  525. package/src/roap/collection.ts +0 -62
  526. package/src/roap/handler.ts +0 -294
  527. package/src/roap/state.ts +0 -156
  528. package/src/roap/util.ts +0 -100
  529. package/test/unit/spec/meeting/effectsState.js +0 -281
  530. package/test/unit/spec/peerconnection-manager/index.js +0 -218
  531. package/test/unit/spec/peerconnection-manager/utils.js +0 -49
  532. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
  533. package/test/unit/spec/roap/util.js +0 -30
  534. /package/dist/common/errors/{reclaim-host-role-error.d.ts → reclaim-host-role-errors.d.ts} +0 -0
  535. /package/src/common/errors/{reclaim-host-role-error.ts → reclaim-host-role-errors.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import {SELF_ROLES, DISPLAY_HINTS} from '../constants';
1
+ import {SELF_ROLES, DISPLAY_HINTS, INTERSTITIAL_DISPLAY_HINTS} from '../constants';
2
2
 
3
3
  const InfoUtils: any = {};
4
4
 
@@ -9,7 +9,15 @@ InfoUtils.parse = (info, roles, isJoined = true) => {
9
9
  coHost: InfoUtils.parseCoHost(info),
10
10
  };
11
11
 
12
- let userDisplayHints = isJoined ? {...parsed.policy} : {};
12
+ let userDisplayHints = isJoined
13
+ ? {...parsed.policy}
14
+ : {
15
+ ...Object.fromEntries(
16
+ Object.entries(parsed.policy).filter(([hint]) =>
17
+ INTERSTITIAL_DISPLAY_HINTS.includes(hint)
18
+ )
19
+ ),
20
+ };
13
21
 
14
22
  if (roles.includes(SELF_ROLES.COHOST)) {
15
23
  userDisplayHints = {...userDisplayHints, ...parsed.coHost};
@@ -29,6 +37,10 @@ InfoUtils.parse = (info, roles, isJoined = true) => {
29
37
  parsed.meetingNumber = info.meetingId;
30
38
  }
31
39
 
40
+ if (info.datachannelUrl) {
41
+ parsed.datachannelUrl = info.datachannelUrl;
42
+ }
43
+
32
44
  return parsed;
33
45
  };
34
46
 
@@ -13,6 +13,10 @@ MediaSharesUtils.parse = (mediaShares: object) => {
13
13
  content: {
14
14
  beneficiaryId: MediaSharesUtils.getContentBeneficiaryId(mediaShares),
15
15
  disposition: MediaSharesUtils.getContentDisposition(mediaShares),
16
+ annotation: MediaSharesUtils.getContentAnnotation(mediaShares),
17
+ url: MediaSharesUtils.getContentUrl(mediaShares),
18
+ shareInstanceId: MediaSharesUtils.getShareInstanceId(mediaShares),
19
+ deviceUrlSharing: MediaSharesUtils.getContentBeneficiaryDeviceUrl(mediaShares),
16
20
  },
17
21
  whiteboard: {
18
22
  beneficiaryId: MediaSharesUtils.getWhiteboardBeneficiaryId(mediaShares),
@@ -140,6 +144,66 @@ MediaSharesUtils.getContentBeneficiaryId = (mediaShares: object) => {
140
144
  return contentFloor.beneficiary.id;
141
145
  };
142
146
 
147
+ /**
148
+ * get live annotation is sharing from media shares (content)
149
+ * @param {Object} mediaShares
150
+ * @returns {Object}
151
+ */
152
+ MediaSharesUtils.getContentAnnotation = (mediaShares: object) => {
153
+ const extractContent = MediaSharesUtils.extractContent(mediaShares);
154
+
155
+ if (!extractContent || !extractContent.annotation) {
156
+ return undefined;
157
+ }
158
+
159
+ return extractContent.annotation;
160
+ };
161
+
162
+ /**
163
+ * get url is sharing from media shares (content)
164
+ * @param {Object} mediaShares
165
+ * @returns {Object}
166
+ */
167
+ MediaSharesUtils.getContentUrl = (mediaShares: object) => {
168
+ const extractContent = MediaSharesUtils.extractContent(mediaShares);
169
+
170
+ if (!extractContent || !extractContent.url) {
171
+ return undefined;
172
+ }
173
+
174
+ return extractContent.url;
175
+ };
176
+
177
+ /**
178
+ * get shareInstanceId is sharing from media shares (content)
179
+ * @param {Object} mediaShares
180
+ * @returns {Object}
181
+ */
182
+ MediaSharesUtils.getShareInstanceId = (mediaShares: object) => {
183
+ const extractContent = MediaSharesUtils.extractContent(mediaShares);
184
+
185
+ if (!extractContent || !extractContent.floor || !extractContent.floor.shareInstanceId) {
186
+ return undefined;
187
+ }
188
+
189
+ return extractContent.floor.shareInstanceId;
190
+ };
191
+
192
+ /**
193
+ * get deviceUrl that is requesting the floor for media shares (content)
194
+ * @param {Object} mediaShares
195
+ * @returns {Object}
196
+ */
197
+ MediaSharesUtils.getContentBeneficiaryDeviceUrl = (mediaShares: object) => {
198
+ const contentFloor = MediaSharesUtils.extractContentFloor(mediaShares);
199
+
200
+ if (!contentFloor || !contentFloor.beneficiary || !contentFloor.beneficiary.deviceUrl) {
201
+ return null;
202
+ }
203
+
204
+ return contentFloor.beneficiary.deviceUrl;
205
+ };
206
+
143
207
  /**
144
208
  * get who is sharing from media shares (whiteboard)
145
209
  * @param {Object} mediaShares
@@ -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,21 +46,60 @@ export default class Parser {
24
46
  DESYNC: 'DESYNC',
25
47
  USE_INCOMING: 'USE_INCOMING',
26
48
  USE_CURRENT: 'USE_CURRENT',
49
+ WAIT: 'WAIT',
27
50
  ERROR: 'ERROR',
51
+ LOCUS_URL_CHANGED: 'LOCUS_URL_CHANGED',
28
52
  };
29
53
 
30
- queue: any;
54
+ queue: SortedQueue<LocusDeltaDto>;
31
55
  workingCopy: any;
56
+ syncTimer?: ReturnType<typeof setTimeout>;
32
57
 
33
58
  /**
34
59
  * @constructs Parser
35
60
  */
36
61
  constructor() {
37
- this.queue = new SimpleQueue();
38
- // @ts-ignore - This is declared as static class member and again being initialized here from same
39
- 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';
40
86
  this.onDeltaAction = null;
41
87
  this.workingCopy = null;
88
+ this.syncTimer = undefined;
89
+ }
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';
42
103
  }
43
104
 
44
105
  /**
@@ -208,7 +269,7 @@ export default class Parser {
208
269
  * @returns {string} loci comparison state
209
270
  */
210
271
  private static compareDelta(current, incoming) {
211
- const {LT, GT, EQ, DESYNC, USE_INCOMING} = Parser.loci;
272
+ const {LT, GT, EQ, DESYNC, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = Parser.loci;
212
273
 
213
274
  const {extractComparisonState: extract} = Parser;
214
275
  const {packComparisonResult: pack} = Parser;
@@ -220,6 +281,13 @@ export default class Parser {
220
281
  return pack(Parser.compareToAction(comparison), result);
221
282
  }
222
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
+
223
291
  comparison = Parser.compareSequence(current.sequence, incoming.baseSequence);
224
292
 
225
293
  switch (extract(comparison)) {
@@ -228,6 +296,21 @@ export default class Parser {
228
296
  comparison = USE_INCOMING;
229
297
  break;
230
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;
231
314
  default:
232
315
  comparison = DESYNC;
233
316
  }
@@ -235,6 +318,49 @@ export default class Parser {
235
318
  return pack(comparison, result);
236
319
  }
237
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
+ }
363
+
238
364
  /**
239
365
  * Compares Locus sequences
240
366
  * @param {Types~Locus} current Current working copy
@@ -393,17 +519,10 @@ export default class Parser {
393
519
  */
394
520
  isValidLocus(newLoci) {
395
521
  let isValid = false;
396
- const {IDLE} = Parser.status;
397
522
  const {isLoci} = Parser;
398
- // @ts-ignore
399
- const setStatus = (status) => {
400
- // @ts-ignore
401
- this.status = status;
402
- };
403
523
 
404
524
  // one or both objects are not locus delta events
405
525
  if (!isLoci(this.workingCopy) || !isLoci(newLoci)) {
406
- setStatus(IDLE);
407
526
  LoggerProxy.logger.info(
408
527
  'Locus-info:parser#processDeltaEvent --> Ignoring non-locus object. workingCopy:',
409
528
  this.workingCopy,
@@ -455,19 +574,25 @@ export default class Parser {
455
574
  * @returns {undefined}
456
575
  */
457
576
  nextEvent() {
458
- // @ts-ignore
459
- if (this.status === Parser.status.PAUSED) {
577
+ if (this.status === 'PAUSED') {
460
578
  LoggerProxy.logger.info('Locus-info:parser#nextEvent --> Locus parser paused.');
461
579
 
462
580
  return;
463
581
  }
464
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
+
465
591
  // continue processing until queue is empty
466
592
  if (this.queue.size() > 0) {
467
593
  this.processDeltaEvent();
468
594
  } else {
469
- // @ts-ignore
470
- this.status = Parser.status.IDLE;
595
+ this.status = 'IDLE';
471
596
  }
472
597
  }
473
598
 
@@ -478,7 +603,7 @@ export default class Parser {
478
603
  * @param {Types~Locus} locus Locus delta
479
604
  * @returns {undefined}
480
605
  */
481
- // eslint-disable-next-line no-unused-vars
606
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
482
607
  onDeltaAction(action: string, locus) {}
483
608
 
484
609
  /**
@@ -489,15 +614,20 @@ export default class Parser {
489
614
  onDeltaEvent(loci) {
490
615
  // enqueue the new loci
491
616
  this.queue.enqueue(loci);
492
- // start processing events in the queue if idle
493
- // and a function handler is defined
494
- // @ts-ignore
495
- if (this.status === Parser.status.IDLE && this.onDeltaAction) {
496
- // Update status, ensure we only process one event at a time.
497
- // @ts-ignore
498
- this.status = Parser.status.WORKING;
499
617
 
500
- 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
+ }
501
631
  }
502
632
  }
503
633
 
@@ -516,11 +646,55 @@ export default class Parser {
516
646
  * @returns {undefined}
517
647
  */
518
648
  pause() {
519
- // @ts-ignore
520
- this.status = Parser.status.PAUSED;
649
+ this.status = 'PAUSED';
521
650
  LoggerProxy.logger.info('Locus-info:parser#pause --> Locus parser paused.');
522
651
  }
523
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
+ }
697
+
524
698
  /**
525
699
  * Processes next locus delta in the queue,
526
700
  * continues until the queue is empty
@@ -528,11 +702,13 @@ export default class Parser {
528
702
  * @returns {undefined}
529
703
  */
530
704
  processDeltaEvent() {
531
- const {DESYNC, USE_INCOMING} = Parser.loci;
705
+ const {DESYNC, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = Parser.loci;
532
706
  const {extractComparisonState: extract} = Parser;
533
707
  const newLoci = this.queue.dequeue();
534
708
 
535
709
  if (!this.isValidLocus(newLoci)) {
710
+ this.nextEvent();
711
+
536
712
  return;
537
713
  }
538
714
 
@@ -543,23 +719,59 @@ export default class Parser {
543
719
  // for full debugging.
544
720
  LoggerProxy.logger.debug(`Locus-info:parser#processDeltaEvent --> Locus Debug: ${result}`);
545
721
 
546
- if (lociComparison === DESYNC) {
547
- // wait for desync response
548
- this.pause();
549
- } else if (lociComparison === USE_INCOMING) {
550
- // update working copy for future comparisons.
551
- // Note: The working copy of parser gets updated in .onFullLocus()
552
- // and here when USE_INCOMING locus.
553
- this.workingCopy = newLoci;
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;
747
+ }
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
+ }
554
765
  }
555
766
 
556
767
  if (this.onDeltaAction) {
557
768
  LoggerProxy.logger.info(
558
- `Locus-info:parser#processDeltaEvent --> Locus Delta Action: ${lociComparison}`
769
+ `Locus-info:parser#processDeltaEvent --> Locus Delta ${Parser.locus2string(
770
+ newLoci
771
+ )}, Action: ${lociComparison}`
559
772
  );
560
773
 
561
- // eslint-disable-next-line no-useless-call
562
- this.onDeltaAction.call(this, lociComparison, newLoci);
774
+ this.onDeltaAction(lociComparison, newLoci);
563
775
  }
564
776
 
565
777
  this.nextEvent();
@@ -571,8 +783,7 @@ export default class Parser {
571
783
  */
572
784
  resume() {
573
785
  LoggerProxy.logger.info('Locus-info:parser#resume --> Locus parser resumed.');
574
- // @ts-ignore
575
- this.status = Parser.status.WORKING;
786
+ this.status = 'WORKING';
576
787
  this.nextEvent();
577
788
  }
578
789