@webex/plugin-meetings 3.8.0 → 3.8.1-next.10

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 (361) hide show
  1. package/README.md +26 -13
  2. package/dist/breakouts/breakout.js +1 -1
  3. package/dist/breakouts/index.js +70 -6
  4. package/dist/breakouts/index.js.map +1 -1
  5. package/dist/common/errors/webex-errors.js +12 -2
  6. package/dist/common/errors/webex-errors.js.map +1 -1
  7. package/dist/config.js +5 -1
  8. package/dist/config.js.map +1 -1
  9. package/dist/constants.js +28 -123
  10. package/dist/constants.js.map +1 -1
  11. package/dist/controls-options-manager/enums.js +3 -0
  12. package/dist/controls-options-manager/enums.js.map +1 -1
  13. package/dist/controls-options-manager/types.js.map +1 -1
  14. package/dist/controls-options-manager/util.js +78 -0
  15. package/dist/controls-options-manager/util.js.map +1 -1
  16. package/dist/interpretation/index.js +4 -4
  17. package/dist/interpretation/index.js.map +1 -1
  18. package/dist/interpretation/siLanguage.js +1 -1
  19. package/dist/locus-info/controlsUtils.js +37 -11
  20. package/dist/locus-info/controlsUtils.js.map +1 -1
  21. package/dist/locus-info/index.js +92 -12
  22. package/dist/locus-info/index.js.map +1 -1
  23. package/dist/locus-info/selfUtils.js +432 -418
  24. package/dist/locus-info/selfUtils.js.map +1 -1
  25. package/dist/media/index.js +17 -17
  26. package/dist/media/index.js.map +1 -1
  27. package/dist/media/properties.js +94 -6
  28. package/dist/media/properties.js.map +1 -1
  29. package/dist/meeting/brbState.js +9 -2
  30. package/dist/meeting/brbState.js.map +1 -1
  31. package/dist/meeting/in-meeting-actions.js +21 -1
  32. package/dist/meeting/in-meeting-actions.js.map +1 -1
  33. package/dist/meeting/index.js +678 -344
  34. package/dist/meeting/index.js.map +1 -1
  35. package/dist/meeting/locusMediaRequest.js +21 -22
  36. package/dist/meeting/locusMediaRequest.js.map +1 -1
  37. package/dist/meeting/muteState.js +4 -4
  38. package/dist/meeting/muteState.js.map +1 -1
  39. package/dist/meeting/request.js +30 -0
  40. package/dist/meeting/request.js.map +1 -1
  41. package/dist/meeting/request.type.js.map +1 -1
  42. package/dist/meeting/util.js +13 -2
  43. package/dist/meeting/util.js.map +1 -1
  44. package/dist/meeting-info/meeting-info-v2.js +373 -68
  45. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  46. package/dist/meeting-info/utilv2.js +5 -1
  47. package/dist/meeting-info/utilv2.js.map +1 -1
  48. package/dist/meetings/index.js +136 -1
  49. package/dist/meetings/index.js.map +1 -1
  50. package/dist/meetings/util.js +14 -0
  51. package/dist/meetings/util.js.map +1 -1
  52. package/dist/member/index.js +55 -9
  53. package/dist/member/index.js.map +1 -1
  54. package/dist/member/types.js +3 -0
  55. package/dist/member/types.js.map +1 -1
  56. package/dist/member/util.js +335 -353
  57. package/dist/member/util.js.map +1 -1
  58. package/dist/members/collection.js.map +1 -1
  59. package/dist/members/index.js +137 -29
  60. package/dist/members/index.js.map +1 -1
  61. package/dist/members/request.js +38 -0
  62. package/dist/members/request.js.map +1 -1
  63. package/dist/members/util.js +36 -1
  64. package/dist/members/util.js.map +1 -1
  65. package/dist/metrics/constants.js +10 -0
  66. package/dist/metrics/constants.js.map +1 -1
  67. package/dist/multistream/remoteMediaManager.js +40 -8
  68. package/dist/multistream/remoteMediaManager.js.map +1 -1
  69. package/dist/reachability/clusterReachability.js +63 -27
  70. package/dist/reachability/clusterReachability.js.map +1 -1
  71. package/dist/reachability/index.js +107 -47
  72. package/dist/reachability/index.js.map +1 -1
  73. package/dist/reachability/reachability.types.js +14 -0
  74. package/dist/reachability/reachability.types.js.map +1 -1
  75. package/dist/reachability/request.js +19 -3
  76. package/dist/reachability/request.js.map +1 -1
  77. package/dist/reconnection-manager/index.js +2 -2
  78. package/dist/reconnection-manager/index.js.map +1 -1
  79. package/dist/recording-controller/util.js +5 -5
  80. package/dist/recording-controller/util.js.map +1 -1
  81. package/dist/roap/index.js.map +1 -1
  82. package/dist/roap/turnDiscovery.js +45 -27
  83. package/dist/roap/turnDiscovery.js.map +1 -1
  84. package/dist/roap/types.js +17 -0
  85. package/dist/roap/types.js.map +1 -0
  86. package/dist/types/common/errors/webex-errors.d.ts +7 -1
  87. package/dist/types/config.d.ts +3 -0
  88. package/dist/types/constants.d.ts +20 -85
  89. package/dist/types/controls-options-manager/enums.d.ts +4 -1
  90. package/dist/types/controls-options-manager/types.d.ts +10 -1
  91. package/dist/types/locus-info/index.d.ts +3 -3
  92. package/dist/types/locus-info/selfUtils.d.ts +216 -1
  93. package/dist/types/media/properties.d.ts +15 -0
  94. package/dist/types/meeting/in-meeting-actions.d.ts +20 -0
  95. package/dist/types/meeting/index.d.ts +65 -1
  96. package/dist/types/meeting/muteState.d.ts +0 -1
  97. package/dist/types/meeting/request.d.ts +12 -1
  98. package/dist/types/meeting/request.type.d.ts +6 -0
  99. package/dist/types/meeting/util.d.ts +3 -1
  100. package/dist/types/meeting-info/meeting-info-v2.d.ts +82 -1
  101. package/dist/types/meetings/index.d.ts +57 -0
  102. package/dist/types/member/index.d.ts +21 -6
  103. package/dist/types/member/types.d.ts +73 -14
  104. package/dist/types/member/util.d.ts +156 -1
  105. package/dist/types/members/collection.d.ts +6 -5
  106. package/dist/types/members/index.d.ts +32 -43
  107. package/dist/types/members/request.d.ts +26 -0
  108. package/dist/types/members/util.d.ts +27 -0
  109. package/dist/types/metrics/constants.d.ts +10 -0
  110. package/dist/types/multistream/remoteMediaManager.d.ts +10 -1
  111. package/dist/types/reachability/clusterReachability.d.ts +15 -7
  112. package/dist/types/reachability/index.d.ts +10 -1
  113. package/dist/types/reachability/reachability.types.d.ts +5 -0
  114. package/dist/types/roap/index.d.ts +3 -2
  115. package/dist/types/roap/turnDiscovery.d.ts +5 -17
  116. package/dist/types/roap/types.d.ts +16 -0
  117. package/dist/webinar/index.js +2 -2
  118. package/dist/webinar/index.js.map +1 -1
  119. package/package.json +24 -23
  120. package/src/breakouts/index.ts +69 -0
  121. package/src/common/errors/webex-errors.ts +8 -1
  122. package/src/config.ts +3 -0
  123. package/src/constants.ts +30 -90
  124. package/src/controls-options-manager/enums.ts +3 -0
  125. package/src/controls-options-manager/types.ts +16 -1
  126. package/src/controls-options-manager/util.ts +93 -0
  127. package/src/interpretation/index.ts +3 -3
  128. package/src/locus-info/controlsUtils.ts +59 -14
  129. package/src/locus-info/index.ts +97 -13
  130. package/src/locus-info/selfUtils.ts +496 -442
  131. package/src/media/index.ts +23 -21
  132. package/src/media/properties.ts +96 -0
  133. package/src/meeting/brbState.ts +11 -2
  134. package/src/meeting/in-meeting-actions.ts +40 -0
  135. package/src/meeting/index.ts +470 -105
  136. package/src/meeting/locusMediaRequest.ts +27 -22
  137. package/src/meeting/muteState.ts +4 -4
  138. package/src/meeting/request.ts +36 -1
  139. package/src/meeting/request.type.ts +7 -0
  140. package/src/meeting/util.ts +11 -2
  141. package/src/meeting-info/meeting-info-v2.ts +254 -8
  142. package/src/meeting-info/utilv2.ts +5 -0
  143. package/src/meetings/index.ts +148 -1
  144. package/src/meetings/util.ts +18 -0
  145. package/src/member/index.ts +68 -22
  146. package/src/member/types.ts +82 -16
  147. package/src/member/util.ts +357 -350
  148. package/src/members/collection.ts +4 -3
  149. package/src/members/index.ts +137 -18
  150. package/src/members/request.ts +44 -0
  151. package/src/members/util.ts +43 -1
  152. package/src/metrics/constants.ts +10 -0
  153. package/src/multistream/remoteMediaManager.ts +32 -10
  154. package/src/reachability/clusterReachability.ts +73 -26
  155. package/src/reachability/index.ts +62 -1
  156. package/src/reachability/reachability.types.ts +6 -0
  157. package/src/reachability/request.ts +7 -0
  158. package/src/reconnection-manager/index.ts +2 -2
  159. package/src/recording-controller/util.ts +17 -13
  160. package/src/roap/index.ts +3 -7
  161. package/src/roap/turnDiscovery.ts +34 -39
  162. package/src/roap/types.ts +23 -0
  163. package/src/webinar/index.ts +1 -1
  164. package/test/unit/spec/breakouts/index.ts +167 -95
  165. package/test/unit/spec/controls-options-manager/util.js +178 -0
  166. package/test/unit/spec/interpretation/index.ts +39 -1
  167. package/test/unit/spec/locus-info/controlsUtils.js +155 -9
  168. package/test/unit/spec/locus-info/index.js +209 -73
  169. package/test/unit/spec/locus-info/selfUtils.js +98 -24
  170. package/test/unit/spec/media/index.ts +150 -18
  171. package/test/unit/spec/media/properties.ts +130 -0
  172. package/test/unit/spec/meeting/brbState.ts +40 -2
  173. package/test/unit/spec/meeting/in-meeting-actions.ts +23 -4
  174. package/test/unit/spec/meeting/index.js +804 -139
  175. package/test/unit/spec/meeting/locusMediaRequest.ts +95 -87
  176. package/test/unit/spec/meeting/muteState.js +73 -2
  177. package/test/unit/spec/meeting/request.js +32 -1
  178. package/test/unit/spec/meeting/utils.js +119 -18
  179. package/test/unit/spec/meeting-info/meetinginfov2.js +484 -114
  180. package/test/unit/spec/meeting-info/utilv2.js +19 -0
  181. package/test/unit/spec/meetings/index.js +146 -2
  182. package/test/unit/spec/member/index.js +7 -0
  183. package/test/unit/spec/member/util.js +24 -0
  184. package/test/unit/spec/members/index.js +304 -78
  185. package/test/unit/spec/members/request.js +68 -22
  186. package/test/unit/spec/members/utils.js +75 -0
  187. package/test/unit/spec/multistream/remoteMediaManager.ts +397 -118
  188. package/test/unit/spec/reachability/clusterReachability.ts +88 -56
  189. package/test/unit/spec/reachability/index.ts +97 -0
  190. package/test/unit/spec/reachability/request.js +47 -2
  191. package/test/unit/spec/reconnection-manager/index.js +4 -4
  192. package/test/unit/spec/roap/turnDiscovery.ts +110 -28
  193. package/test/unit/spec/webinar/index.ts +5 -0
  194. package/dist/annotation/annotation.types.d.ts +0 -42
  195. package/dist/annotation/constants.d.ts +0 -31
  196. package/dist/annotation/index.d.ts +0 -117
  197. package/dist/breakouts/breakout.d.ts +0 -8
  198. package/dist/breakouts/collection.d.ts +0 -5
  199. package/dist/breakouts/edit-lock-error.d.ts +0 -15
  200. package/dist/breakouts/events.d.ts +0 -8
  201. package/dist/breakouts/index.d.ts +0 -5
  202. package/dist/breakouts/request.d.ts +0 -22
  203. package/dist/breakouts/utils.d.ts +0 -15
  204. package/dist/common/browser-detection.d.ts +0 -9
  205. package/dist/common/collection.d.ts +0 -48
  206. package/dist/common/config.d.ts +0 -2
  207. package/dist/common/errors/captcha-error.d.ts +0 -15
  208. package/dist/common/errors/intent-to-join.d.ts +0 -16
  209. package/dist/common/errors/join-meeting.d.ts +0 -17
  210. package/dist/common/errors/media.d.ts +0 -15
  211. package/dist/common/errors/no-meeting-info.d.ts +0 -14
  212. package/dist/common/errors/parameter.d.ts +0 -15
  213. package/dist/common/errors/password-error.d.ts +0 -15
  214. package/dist/common/errors/permission.d.ts +0 -14
  215. package/dist/common/errors/reclaim-host-role-error.js +0 -149
  216. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  217. package/dist/common/errors/reclaim-host-role-errors.d.ts +0 -60
  218. package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
  219. package/dist/common/errors/reconnection-in-progress.js +0 -33
  220. package/dist/common/errors/reconnection-in-progress.js.map +0 -1
  221. package/dist/common/errors/reconnection.d.ts +0 -15
  222. package/dist/common/errors/stats.d.ts +0 -15
  223. package/dist/common/errors/webex-errors.d.ts +0 -93
  224. package/dist/common/errors/webex-meetings-error.d.ts +0 -20
  225. package/dist/common/events/events-scope.d.ts +0 -17
  226. package/dist/common/events/events.d.ts +0 -12
  227. package/dist/common/events/trigger-proxy.d.ts +0 -2
  228. package/dist/common/events/util.d.ts +0 -2
  229. package/dist/common/logs/logger-config.d.ts +0 -2
  230. package/dist/common/logs/logger-proxy.d.ts +0 -2
  231. package/dist/common/logs/request.d.ts +0 -36
  232. package/dist/common/queue.d.ts +0 -34
  233. package/dist/config.d.ts +0 -72
  234. package/dist/constants.d.ts +0 -1088
  235. package/dist/controls-options-manager/constants.d.ts +0 -4
  236. package/dist/controls-options-manager/enums.d.ts +0 -15
  237. package/dist/controls-options-manager/index.d.ts +0 -136
  238. package/dist/controls-options-manager/types.d.ts +0 -43
  239. package/dist/controls-options-manager/util.d.ts +0 -1
  240. package/dist/index.d.ts +0 -7
  241. package/dist/interceptors/index.d.ts +0 -2
  242. package/dist/interceptors/locusRetry.d.ts +0 -27
  243. package/dist/interpretation/collection.d.ts +0 -5
  244. package/dist/interpretation/index.d.ts +0 -5
  245. package/dist/interpretation/siLanguage.d.ts +0 -5
  246. package/dist/locus-info/controlsUtils.d.ts +0 -2
  247. package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
  248. package/dist/locus-info/fullState.d.ts +0 -2
  249. package/dist/locus-info/hostUtils.d.ts +0 -2
  250. package/dist/locus-info/index.d.ts +0 -322
  251. package/dist/locus-info/infoUtils.d.ts +0 -2
  252. package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
  253. package/dist/locus-info/parser.d.ts +0 -272
  254. package/dist/locus-info/selfUtils.d.ts +0 -2
  255. package/dist/media/index.d.ts +0 -34
  256. package/dist/media/properties.d.ts +0 -93
  257. package/dist/media/util.d.ts +0 -2
  258. package/dist/mediaQualityMetrics/config.d.ts +0 -241
  259. package/dist/mediaQualityMetrics/config.js +0 -502
  260. package/dist/mediaQualityMetrics/config.js.map +0 -1
  261. package/dist/meeting/effectsState.js +0 -260
  262. package/dist/meeting/effectsState.js.map +0 -1
  263. package/dist/meeting/in-meeting-actions.d.ts +0 -167
  264. package/dist/meeting/index.d.ts +0 -1825
  265. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  266. package/dist/meeting/muteState.d.ts +0 -178
  267. package/dist/meeting/request.d.ts +0 -295
  268. package/dist/meeting/request.type.d.ts +0 -11
  269. package/dist/meeting/state.d.ts +0 -9
  270. package/dist/meeting/util.d.ts +0 -119
  271. package/dist/meeting/voicea-meeting.d.ts +0 -16
  272. package/dist/meeting-info/collection.d.ts +0 -20
  273. package/dist/meeting-info/index.d.ts +0 -69
  274. package/dist/meeting-info/meeting-info-v2.d.ts +0 -123
  275. package/dist/meeting-info/request.d.ts +0 -22
  276. package/dist/meeting-info/util.d.ts +0 -2
  277. package/dist/meeting-info/utilv2.d.ts +0 -2
  278. package/dist/meetings/collection.d.ts +0 -40
  279. package/dist/meetings/index.d.ts +0 -390
  280. package/dist/meetings/meetings.types.d.ts +0 -4
  281. package/dist/meetings/request.d.ts +0 -27
  282. package/dist/meetings/util.d.ts +0 -18
  283. package/dist/member/index.d.ts +0 -160
  284. package/dist/member/member.types.js +0 -17
  285. package/dist/member/member.types.js.map +0 -1
  286. package/dist/member/types.d.ts +0 -32
  287. package/dist/member/util.d.ts +0 -2
  288. package/dist/members/collection.d.ts +0 -29
  289. package/dist/members/index.d.ts +0 -353
  290. package/dist/members/request.d.ts +0 -114
  291. package/dist/members/types.d.ts +0 -25
  292. package/dist/members/util.d.ts +0 -215
  293. package/dist/metrics/config.js +0 -276
  294. package/dist/metrics/config.js.map +0 -1
  295. package/dist/metrics/constants.d.ts +0 -70
  296. package/dist/metrics/index.d.ts +0 -45
  297. package/dist/multistream/mediaRequestManager.d.ts +0 -119
  298. package/dist/multistream/receiveSlot.d.ts +0 -68
  299. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  300. package/dist/multistream/remoteMedia.d.ts +0 -72
  301. package/dist/multistream/remoteMediaGroup.d.ts +0 -49
  302. package/dist/multistream/remoteMediaManager.d.ts +0 -300
  303. package/dist/multistream/sendSlotManager.d.ts +0 -69
  304. package/dist/networkQualityMonitor/index.d.ts +0 -70
  305. package/dist/networkQualityMonitor/index.js +0 -221
  306. package/dist/networkQualityMonitor/index.js.map +0 -1
  307. package/dist/peer-connection-manager/index.js +0 -671
  308. package/dist/peer-connection-manager/index.js.map +0 -1
  309. package/dist/peer-connection-manager/util.js +0 -109
  310. package/dist/peer-connection-manager/util.js.map +0 -1
  311. package/dist/personal-meeting-room/index.d.ts +0 -47
  312. package/dist/personal-meeting-room/request.d.ts +0 -14
  313. package/dist/personal-meeting-room/util.d.ts +0 -2
  314. package/dist/reachability/clusterReachability.d.ts +0 -109
  315. package/dist/reachability/index.d.ts +0 -105
  316. package/dist/reachability/request.d.ts +0 -39
  317. package/dist/reachability/util.d.ts +0 -8
  318. package/dist/reactions/constants.d.ts +0 -3
  319. package/dist/reactions/reactions.d.ts +0 -4
  320. package/dist/reactions/reactions.type.d.ts +0 -52
  321. package/dist/reconnection-manager/index.d.ts +0 -136
  322. package/dist/recording-controller/enums.d.ts +0 -7
  323. package/dist/recording-controller/index.d.ts +0 -207
  324. package/dist/recording-controller/util.d.ts +0 -14
  325. package/dist/roap/collection.js +0 -62
  326. package/dist/roap/collection.js.map +0 -1
  327. package/dist/roap/handler.js +0 -275
  328. package/dist/roap/handler.js.map +0 -1
  329. package/dist/roap/index.d.ts +0 -86
  330. package/dist/roap/request.d.ts +0 -39
  331. package/dist/roap/state.js +0 -126
  332. package/dist/roap/state.js.map +0 -1
  333. package/dist/roap/turnDiscovery.d.ts +0 -155
  334. package/dist/roap/util.js +0 -75
  335. package/dist/roap/util.js.map +0 -1
  336. package/dist/rtcMetrics/constants.d.ts +0 -4
  337. package/dist/rtcMetrics/constants.js +0 -11
  338. package/dist/rtcMetrics/constants.js.map +0 -1
  339. package/dist/rtcMetrics/index.d.ts +0 -61
  340. package/dist/rtcMetrics/index.js +0 -197
  341. package/dist/rtcMetrics/index.js.map +0 -1
  342. package/dist/statsAnalyzer/global.d.ts +0 -36
  343. package/dist/statsAnalyzer/global.js +0 -126
  344. package/dist/statsAnalyzer/global.js.map +0 -1
  345. package/dist/statsAnalyzer/index.d.ts +0 -217
  346. package/dist/statsAnalyzer/index.js +0 -1013
  347. package/dist/statsAnalyzer/index.js.map +0 -1
  348. package/dist/statsAnalyzer/mqaUtil.d.ts +0 -48
  349. package/dist/statsAnalyzer/mqaUtil.js +0 -179
  350. package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
  351. package/dist/transcription/index.d.ts +0 -64
  352. package/dist/types/common/errors/reconnection-in-progress.d.ts +0 -9
  353. package/dist/types/mediaQualityMetrics/config.d.ts +0 -241
  354. package/dist/types/networkQualityMonitor/index.d.ts +0 -70
  355. package/dist/types/rtcMetrics/constants.d.ts +0 -4
  356. package/dist/types/rtcMetrics/index.d.ts +0 -71
  357. package/dist/types/statsAnalyzer/global.d.ts +0 -36
  358. package/dist/types/statsAnalyzer/index.d.ts +0 -217
  359. package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
  360. package/dist/webinar/collection.d.ts +0 -16
  361. package/dist/webinar/index.d.ts +0 -5
@@ -807,6 +807,67 @@ export default class Meetings extends WebexPlugin {
807
807
  }
808
808
  }
809
809
 
810
+ /**
811
+ * API to toggle usage of audio main DTX, needs to be called before webex.meetings.register()
812
+ *
813
+ * @param {Boolean} newValue
814
+ * @private
815
+ * @memberof Meetings
816
+ * @returns {undefined}
817
+ */
818
+ private _toggleDisableAudioMainDtx(newValue: boolean) {
819
+ if (typeof newValue !== 'boolean') {
820
+ return;
821
+ }
822
+
823
+ // @ts-ignore
824
+ if (this.config.experimental.disableAudioMainDtx !== newValue) {
825
+ // @ts-ignore
826
+ this.config.experimental.disableAudioMainDtx = newValue;
827
+ }
828
+ }
829
+
830
+ /**
831
+ * API to toggle usage of audio twcc support
832
+ *
833
+ * @param {Boolean} newValue
834
+ * @private
835
+ * @memberof Meetings
836
+ * @returns {undefined}
837
+ */
838
+ private _toggleEnableAudioTwccForMultistream(newValue: boolean) {
839
+ if (typeof newValue !== 'boolean') {
840
+ return;
841
+ }
842
+
843
+ // @ts-ignore
844
+ if (this.config.enableAudioTwccForMultistream !== newValue) {
845
+ // @ts-ignore
846
+ this.config.enableAudioTwccForMultistream = newValue;
847
+ }
848
+ }
849
+
850
+ /**
851
+ * API to toggle stopping ICE Candidates Gathering after first relay candidate,
852
+ * needs to be called before webex.meetings.joinWithMedia()
853
+ *
854
+ * @param {Boolean} newValue
855
+ * @private
856
+ * @memberof Meetings
857
+ * @returns {undefined}
858
+ */
859
+ private _toggleStopIceGatheringAfterFirstRelayCandidate(newValue: boolean) {
860
+ if (typeof newValue !== 'boolean') {
861
+ return;
862
+ }
863
+
864
+ // @ts-ignore
865
+ if (this.config.stopIceGatheringAfterFirstRelayCandidate !== newValue) {
866
+ // @ts-ignore
867
+ this.config.stopIceGatheringAfterFirstRelayCandidate = newValue;
868
+ }
869
+ }
870
+
810
871
  /**
811
872
  * Executes a registration step and updates the registration status.
812
873
  * @param {Function} step - The registration step to execute.
@@ -854,7 +915,7 @@ export default class Meetings extends WebexPlugin {
854
915
  this.executeRegistrationStep(
855
916
  () =>
856
917
  this.startReachability('registration').catch((error) => {
857
- LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);
918
+ LoggerProxy.logger.warn(`Meetings:index#register --> startReachability failed:`, error);
858
919
  }),
859
920
  'startReachability'
860
921
  ),
@@ -935,6 +996,21 @@ export default class Meetings extends WebexPlugin {
935
996
  .disconnect()
936
997
  // @ts-ignore
937
998
  .then(() => this.webex.internal.device.unregister())
999
+ .catch((error) => {
1000
+ // If error status code is 404, continue the chain
1001
+ if (error.statusCode === 404) {
1002
+ LoggerProxy.logger.info(
1003
+ 'Meetings:index#unregister --> 404 error during device unregister, proceeding normally'
1004
+ );
1005
+
1006
+ return; // returning undefined allows the chain to continue
1007
+ }
1008
+ // For any other status code, break the chain by rethrowing
1009
+ LoggerProxy.logger.error(
1010
+ `Meetings:index#unregister --> Failed to unregister device: ${error.message}`
1011
+ );
1012
+ throw error; // rethrow to break the promise chain
1013
+ })
938
1014
  .then(() => {
939
1015
  Trigger.trigger(
940
1016
  this,
@@ -1217,6 +1293,29 @@ export default class Meetings extends WebexPlugin {
1217
1293
  );
1218
1294
  }
1219
1295
 
1296
+ /**
1297
+ * Fetch static meeting link for given conversation url.
1298
+ *
1299
+ * @param {string} conversationUrl - url for conversation
1300
+ * @returns {Promise}
1301
+ * @public
1302
+ * @memberof Meetings
1303
+ */
1304
+ public fetchStaticMeetingLink(conversationUrl: string): Promise<any> {
1305
+ return (
1306
+ this.meetingInfo
1307
+ .fetchStaticMeetingLink(conversationUrl)
1308
+ // Catch a failure to fetch static meeting link.
1309
+ .catch((error) => {
1310
+ LoggerProxy.logger.error(
1311
+ `Meetings:index#fetchStaticMeetingLink --> ERROR, unable to fetch persistent meeting link: ${error.message}`
1312
+ );
1313
+
1314
+ return Promise.reject(error);
1315
+ })
1316
+ );
1317
+ }
1318
+
1220
1319
  /**
1221
1320
  * Create a meeting or return an existing meeting.
1222
1321
  *
@@ -1369,6 +1468,54 @@ export default class Meetings extends WebexPlugin {
1369
1468
  );
1370
1469
  }
1371
1470
 
1471
+ /**
1472
+ * Enable static meeting links for given conversation url.
1473
+ *
1474
+ *
1475
+ * @param {string} conversationUrl - url for conversation
1476
+ * @returns {Promise}
1477
+ * @public
1478
+ * @memberof Meetings
1479
+ */
1480
+ public enableStaticMeetingLink(conversationUrl: string): Promise<any> {
1481
+ return (
1482
+ this.meetingInfo
1483
+ .enableStaticMeetingLink(conversationUrl)
1484
+ // Catch a failure to enable static meeting link.
1485
+ .catch((error) => {
1486
+ LoggerProxy.logger.error(
1487
+ `Meetings:index#enableStaticMeetingLink --> ERROR, unable to enable static meeting link: ${error.message}`
1488
+ );
1489
+
1490
+ return Promise.reject(error);
1491
+ })
1492
+ );
1493
+ }
1494
+
1495
+ /**
1496
+ * Disable static meeting links for given conversation url.
1497
+ *
1498
+ *
1499
+ * @param {string} conversationUrl - url for conversation
1500
+ * @returns {Promise}
1501
+ * @public
1502
+ * @memberof Meetings
1503
+ */
1504
+ public disableStaticMeetingLink(conversationUrl: string): Promise<any> {
1505
+ return (
1506
+ this.meetingInfo
1507
+ .disableStaticMeetingLink(conversationUrl)
1508
+ // Catch a failure to disable static meeting link.
1509
+ .catch((error) => {
1510
+ LoggerProxy.logger.error(
1511
+ `Meetings:index#disableStaticMeetingLink --> ERROR, unable to disable static meeting link: ${error.message}`
1512
+ );
1513
+
1514
+ return Promise.reject(error);
1515
+ })
1516
+ );
1517
+ }
1518
+
1372
1519
  /**
1373
1520
  * Create meeting
1374
1521
  *
@@ -99,6 +99,24 @@ MeetingsUtil.getMediaServer = (sdp) => {
99
99
  return mediaServer;
100
100
  };
101
101
 
102
+ MeetingsUtil.getMediaServerIp = (sdp) => {
103
+ let mediaServerIp;
104
+
105
+ // Attempt to collect the media server from the roap message.
106
+ try {
107
+ mediaServerIp = sdp
108
+ .split('\r\n')
109
+ .find((line) => line.startsWith('o='))
110
+ .match(/o=\S+ \d+ \d+ IN IP4 ([\d.]+)/)?.[1]
111
+ .toLowerCase()
112
+ .trim();
113
+ } catch {
114
+ mediaServerIp = undefined;
115
+ }
116
+
117
+ return mediaServerIp;
118
+ };
119
+
102
120
  MeetingsUtil.checkForCorrelationId = (deviceUrl, locus) => {
103
121
  let devices = [];
104
122
 
@@ -1,18 +1,20 @@
1
1
  /*!
2
2
  * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
3
  */
4
- import {MEETINGS, _IN_LOBBY_, _NOT_IN_MEETING_, _IN_MEETING_} from '../constants';
5
- import {IExternalRoles, IMediaStatus, ParticipantWithRoles} from './types';
4
+ import {MEETINGS, _IN_LOBBY_, _NOT_IN_MEETING_, _IN_MEETING_, _OBSERVE_} from '../constants';
5
+ import {IExternalRoles, IMediaStatus, Participant, ParticipantUrl} from './types';
6
6
 
7
7
  import MemberUtil from './util';
8
8
 
9
+ export type MemberId = string;
9
10
  /**
10
11
  * @class Member
11
12
  */
12
13
  export default class Member {
13
- associatedUser: any;
14
+ associatedUser: MemberId | null; // deprecated, use associatedUsers instead
15
+ associatedUsers: Set<MemberId>; // users associated with this device, empty if this member is not a device
14
16
  canReclaimHost: boolean;
15
- id: any;
17
+ id: MemberId;
16
18
  isAudioMuted: any;
17
19
  isContentSharing: any;
18
20
  isDevice: any;
@@ -23,11 +25,13 @@ export default class Member {
23
25
  isInMeeting: any;
24
26
  isModerator: any;
25
27
  isModeratorAssignmentProhibited: any;
28
+ isPresenterAssignmentProhibited: any;
26
29
  isMutable: any;
27
30
  isNotAdmitted: any;
28
31
  isRecording: any;
29
32
  isRemovable: any;
30
33
  isSelf: any;
34
+ isPairedWithSelf: boolean; // true for a device that we are paired with
31
35
  isBrb: boolean;
32
36
  isUser: any;
33
37
  isVideoMuted: any;
@@ -41,6 +45,10 @@ export default class Member {
41
45
  supportLiveAnnotation: boolean;
42
46
  type: any;
43
47
  namespace = MEETINGS;
48
+ pairedWith: {
49
+ participantUrl?: ParticipantUrl;
50
+ memberId?: MemberId;
51
+ };
44
52
 
45
53
  /**
46
54
  * @param {Object} participant - the locus participant
@@ -53,7 +61,7 @@ export default class Member {
53
61
  * @memberof Member
54
62
  */
55
63
  constructor(
56
- participant: object,
64
+ participant: Participant,
57
65
  options:
58
66
  | {
59
67
  selfId: string;
@@ -200,13 +208,23 @@ export default class Member {
200
208
  */
201
209
  this.isUser = null;
202
210
  /**
211
+ * Deprecated: use associatedUsers instead
203
212
  * Is this member associated to another user by way of pairing (typical of devices)
204
213
  * @instance
205
- * @type {String}
214
+ * @type {MemberId|null}
215
+ * @deprecated
206
216
  * @public
207
217
  * @memberof Member
208
218
  */
209
219
  this.associatedUser = null;
220
+ /**
221
+ * Is this member associated to another user by way of pairing (typical of devices)
222
+ * @instance
223
+ * @type {String}
224
+ * @public
225
+ * @memberof Member
226
+ */
227
+ this.associatedUsers = new Set<MemberId>();
210
228
  /**
211
229
  * @instance
212
230
  * @type {Boolean}
@@ -257,6 +275,22 @@ export default class Member {
257
275
  */
258
276
  this.isModeratorAssignmentProhibited = null;
259
277
 
278
+ /**
279
+ * @instance
280
+ * @type {Boolean}
281
+ * @public
282
+ * @memberof Member
283
+ */
284
+ this.isPresenterAssignmentProhibited = null;
285
+
286
+ /**
287
+ * @instance
288
+ * @type {Boolean}
289
+ * @public
290
+ * @memberof Member
291
+ */
292
+ this.isPairedWithSelf = false;
293
+
260
294
  /**
261
295
  * @instance
262
296
  * @type {IExternalRoles}
@@ -265,6 +299,10 @@ export default class Member {
265
299
  */
266
300
  this.roles = null;
267
301
 
302
+ this.pairedWith = {
303
+ participantUrl: undefined,
304
+ memberId: undefined,
305
+ };
268
306
  /**
269
307
  * @instance
270
308
  * @type {IMediaStatus}
@@ -290,9 +328,10 @@ export default class Member {
290
328
  * @private
291
329
  * @memberof Member
292
330
  */
293
- private processParticipant(participant: object) {
331
+ private processParticipant(participant: Participant) {
294
332
  this.participant = participant;
295
333
  if (participant) {
334
+ this.processPairedDevice(participant);
296
335
  this.canReclaimHost = MemberUtil.canReclaimHost(participant);
297
336
  this.id = MemberUtil.extractId(participant);
298
337
  this.name = MemberUtil.extractName(participant);
@@ -309,13 +348,27 @@ export default class Member {
309
348
  this.isModerator = MemberUtil.isModerator(participant);
310
349
  this.isModeratorAssignmentProhibited =
311
350
  MemberUtil.isModeratorAssignmentProhibited(participant);
351
+ this.isPresenterAssignmentProhibited =
352
+ MemberUtil.isPresenterAssignmentProhibited(participant);
312
353
  this.processStatus(participant);
313
- this.processRoles(participant as ParticipantWithRoles);
354
+ this.processRoles(participant);
314
355
  // must be done last
315
356
  this.isNotAdmitted = MemberUtil.isNotAdmitted(participant, this.isGuest, this.status);
316
357
  }
317
358
  }
318
359
 
360
+ /**
361
+ * Checks if the participant is paired with another device
362
+ *
363
+ * @param {any} participant the locus participant object
364
+ * @returns {void}
365
+ */
366
+ processPairedDevice(participant: Participant) {
367
+ // we can't populate this.pairedWith.memberId here because the member for that device might not yet exist
368
+ // so only populating the participantUrl and memberId will be set later
369
+ this.pairedWith.participantUrl = MemberUtil.extractPairedWithParticipantUrl(participant);
370
+ }
371
+
319
372
  /**
320
373
  * Use the members options and participant values to set on the member
321
374
  * @param {Object} participant the locus participant object
@@ -324,7 +377,7 @@ export default class Member {
324
377
  * @private
325
378
  * @memberof Member
326
379
  */
327
- private processParticipantOptions(participant: object, options: any) {
380
+ private processParticipantOptions(participant: Participant, options: any) {
328
381
  if (participant && options) {
329
382
  this.processIsSelf(participant, options.selfId);
330
383
  this.processIsHost(participant, options.hostId);
@@ -367,7 +420,7 @@ export default class Member {
367
420
  * @private
368
421
  * @memberof Member
369
422
  */
370
- private processStatus(participant: object) {
423
+ private processStatus(participant: Participant) {
371
424
  this.status = MemberUtil.extractStatus(participant);
372
425
  switch (this.status) {
373
426
  case _IN_LOBBY_:
@@ -429,11 +482,9 @@ export default class Member {
429
482
  * @public
430
483
  * @memberof Member
431
484
  */
432
- public processIsContentSharing(participant: object, sharingId: string) {
485
+ public processIsContentSharing(participant: Participant, sharingId: string) {
433
486
  if (MemberUtil.isUser(participant)) {
434
487
  this.isContentSharing = MemberUtil.isSame(participant, sharingId);
435
- } else if (MemberUtil.isDevice(participant)) {
436
- this.isContentSharing = MemberUtil.isAssociatedSame(participant, sharingId);
437
488
  }
438
489
  }
439
490
 
@@ -445,7 +496,7 @@ export default class Member {
445
496
  * @public
446
497
  * @memberof Member
447
498
  */
448
- public processIsRecording(participant: object, recordingId: string) {
499
+ public processIsRecording(participant: Participant, recordingId: string) {
449
500
  this.isRecording = MemberUtil.isSame(participant, recordingId);
450
501
  }
451
502
 
@@ -457,12 +508,9 @@ export default class Member {
457
508
  * @private
458
509
  * @memberof Member
459
510
  */
460
- private processIsSelf(participant: object, selfId: string) {
511
+ private processIsSelf(participant: Participant, selfId: string) {
461
512
  if (MemberUtil.isUser(participant)) {
462
513
  this.isSelf = MemberUtil.isSame(participant, selfId);
463
- } else if (MemberUtil.isDevice(participant)) {
464
- this.isSelf = MemberUtil.isAssociatedSame(participant, selfId);
465
- this.associatedUser = selfId;
466
514
  }
467
515
  }
468
516
 
@@ -474,11 +522,9 @@ export default class Member {
474
522
  * @private
475
523
  * @memberof Member
476
524
  */
477
- private processIsHost(participant: object, hostId: string) {
525
+ private processIsHost(participant: Participant, hostId: string) {
478
526
  if (MemberUtil.isUser(participant)) {
479
527
  this.isHost = MemberUtil.isSame(participant, hostId);
480
- } else if (MemberUtil.isDevice(participant)) {
481
- this.isHost = MemberUtil.isAssociatedSame(participant, hostId);
482
528
  }
483
529
  }
484
530
 
@@ -489,7 +535,7 @@ export default class Member {
489
535
  * @private
490
536
  * @memberof Member
491
537
  */
492
- private processRoles(participant: ParticipantWithRoles) {
538
+ private processRoles(participant: Participant) {
493
539
  this.roles = MemberUtil.extractControlRoles(participant);
494
540
  }
495
541
 
@@ -15,22 +15,6 @@ export type ServerRoleShape = {
15
15
  hasRole: boolean;
16
16
  };
17
17
 
18
- export type ParticipantWithRoles = {
19
- controls: {
20
- role: {
21
- roles: Array<ServerRoleShape>;
22
- };
23
- };
24
- };
25
-
26
- export type ParticipantWithBrb = {
27
- controls: {
28
- brb?: {
29
- enabled: boolean;
30
- };
31
- };
32
- };
33
-
34
18
  // values are inherited from locus so don't update these
35
19
  export enum MediaStatus {
36
20
  RECVONLY = 'RECVONLY', // participant only receiving and not sending
@@ -44,3 +28,85 @@ export interface IMediaStatus {
44
28
  audio: MediaStatus;
45
29
  video: MediaStatus;
46
30
  }
31
+
32
+ export type Csi = number;
33
+ export type Direction = 'inactive' | 'sendrecv' | 'sendonly' | 'recvonly';
34
+ export type ParticipantUrl = string;
35
+ export interface MediaSession {
36
+ csi: Csi;
37
+ direction: Direction;
38
+ mediaContent: 'main' | 'slides';
39
+ mediaType: 'audio' | 'video';
40
+ state: string;
41
+ }
42
+
43
+ export interface Intent {
44
+ associatedWith: ParticipantUrl;
45
+ id: string;
46
+ type: string; // could be "WAIT" or "OBSERVE" or other....
47
+ }
48
+ export interface ParticipantDevice {
49
+ correlationId: string;
50
+ csis: Csi[];
51
+ deviceType: string; // WDM device type, could be "WEB", "TP_ENDPOINT", "MAC" or other things, don't know the full list, so keeping it as string
52
+ intent?: Intent;
53
+ intents: Array<Intent | null>;
54
+ isVideoCallback: boolean;
55
+ mediaSessions: Array<MediaSession>;
56
+ mediaSessionsExternal: boolean;
57
+ state: string; // probably one of MEETING_STATE.STATES
58
+ }
59
+
60
+ // this is not a complete type, Locus may send more fields
61
+ export interface ParticipantPerson {
62
+ id: string;
63
+ isExternal: boolean;
64
+ name: string;
65
+ orgId: string;
66
+ }
67
+
68
+ export interface ParticipantMediaStatus {
69
+ audioStatus: MediaStatus;
70
+ videoStatus: MediaStatus;
71
+ audioSlidesStatus?: MediaStatus;
72
+ videoSlidesStatus?: MediaStatus;
73
+ csis: Csi[];
74
+ }
75
+
76
+ // this is not a complete type, Locus may send more fields
77
+ export interface ParticipantControls {
78
+ role: {
79
+ roles: Array<ServerRoleShape>;
80
+ };
81
+ brb?: {
82
+ enabled: boolean;
83
+ };
84
+ hand: {
85
+ raised: boolean;
86
+ };
87
+ localRecord: {
88
+ recording: boolean;
89
+ };
90
+ }
91
+
92
+ // this is not a complete type, Locus may send more fields
93
+ export interface Participant {
94
+ canBeController: boolean;
95
+ controls: ParticipantControls;
96
+ deviceUrl: string;
97
+ devices: Array<ParticipantDevice>;
98
+ guest: boolean;
99
+ id: string;
100
+ identity: string;
101
+ identityTrustLevel: string; // could be 'INTERNAL', 'EXTERNAL' or other....
102
+ isCreator: boolean;
103
+ moderator: boolean; // Locus docs say this is deprecated and role control should be used instead
104
+ moderatorAssignmentNotAllowed: boolean;
105
+ presenterAssignmentNotAllowed: boolean;
106
+ person: ParticipantPerson;
107
+ resourceGuest: boolean;
108
+ state: string; // probably one of MEETING_STATE.STATES
109
+ status: ParticipantMediaStatus;
110
+ type: string;
111
+ url: ParticipantUrl;
112
+ }