@webex/plugin-meetings 3.0.0-beta.2 → 3.0.0-beta.200

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