@webex/plugin-meetings 3.0.0-beta.26 → 3.0.0-beta.261

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 +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +114 -14
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/edit-lock-error.js +52 -0
  11. package/dist/breakouts/edit-lock-error.js.map +1 -0
  12. package/dist/breakouts/events.js +45 -0
  13. package/dist/breakouts/events.js.map +1 -0
  14. package/dist/breakouts/index.js +841 -19
  15. package/dist/breakouts/index.js.map +1 -1
  16. package/dist/breakouts/request.js +78 -0
  17. package/dist/breakouts/request.js.map +1 -0
  18. package/dist/breakouts/utils.js +67 -0
  19. package/dist/breakouts/utils.js.map +1 -0
  20. package/dist/common/errors/webex-errors.js +28 -7
  21. package/dist/common/errors/webex-errors.js.map +1 -1
  22. package/dist/common/logs/logger-proxy.js +1 -1
  23. package/dist/common/logs/logger-proxy.js.map +1 -1
  24. package/dist/common/queue.js +24 -9
  25. package/dist/common/queue.js.map +1 -1
  26. package/dist/config.js +5 -10
  27. package/dist/config.js.map +1 -1
  28. package/dist/constants.js +196 -28
  29. package/dist/constants.js.map +1 -1
  30. package/dist/controls-options-manager/enums.js +14 -2
  31. package/dist/controls-options-manager/enums.js.map +1 -1
  32. package/dist/controls-options-manager/index.js +109 -15
  33. package/dist/controls-options-manager/index.js.map +1 -1
  34. package/dist/controls-options-manager/types.js +7 -0
  35. package/dist/controls-options-manager/types.js.map +1 -0
  36. package/dist/controls-options-manager/util.js +309 -18
  37. package/dist/controls-options-manager/util.js.map +1 -1
  38. package/dist/index.js +112 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/interpretation/collection.js +23 -0
  41. package/dist/interpretation/collection.js.map +1 -0
  42. package/dist/interpretation/index.js +366 -0
  43. package/dist/interpretation/index.js.map +1 -0
  44. package/dist/interpretation/siLanguage.js +25 -0
  45. package/dist/interpretation/siLanguage.js.map +1 -0
  46. package/dist/locus-info/controlsUtils.js +91 -2
  47. package/dist/locus-info/controlsUtils.js.map +1 -1
  48. package/dist/locus-info/index.js +381 -62
  49. package/dist/locus-info/index.js.map +1 -1
  50. package/dist/locus-info/infoUtils.js +7 -1
  51. package/dist/locus-info/infoUtils.js.map +1 -1
  52. package/dist/locus-info/mediaSharesUtils.js +43 -1
  53. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  54. package/dist/locus-info/parser.js +224 -63
  55. package/dist/locus-info/parser.js.map +1 -1
  56. package/dist/locus-info/selfUtils.js +89 -14
  57. package/dist/locus-info/selfUtils.js.map +1 -1
  58. package/dist/media/index.js +58 -116
  59. package/dist/media/index.js.map +1 -1
  60. package/dist/media/properties.js +60 -121
  61. package/dist/media/properties.js.map +1 -1
  62. package/dist/meeting/in-meeting-actions.js +82 -2
  63. package/dist/meeting/in-meeting-actions.js.map +1 -1
  64. package/dist/meeting/index.js +3022 -2795
  65. package/dist/meeting/index.js.map +1 -1
  66. package/dist/meeting/locusMediaRequest.js +292 -0
  67. package/dist/meeting/locusMediaRequest.js.map +1 -0
  68. package/dist/meeting/muteState.js +230 -124
  69. package/dist/meeting/muteState.js.map +1 -1
  70. package/dist/meeting/request.js +256 -196
  71. package/dist/meeting/request.js.map +1 -1
  72. package/dist/meeting/util.js +601 -417
  73. package/dist/meeting/util.js.map +1 -1
  74. package/dist/meeting-info/index.js +70 -7
  75. package/dist/meeting-info/index.js.map +1 -1
  76. package/dist/meeting-info/meeting-info-v2.js +189 -51
  77. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  78. package/dist/meeting-info/util.js +1 -1
  79. package/dist/meeting-info/util.js.map +1 -1
  80. package/dist/meeting-info/utilv2.js +36 -36
  81. package/dist/meeting-info/utilv2.js.map +1 -1
  82. package/dist/meetings/collection.js +22 -0
  83. package/dist/meetings/collection.js.map +1 -1
  84. package/dist/meetings/index.js +372 -90
  85. package/dist/meetings/index.js.map +1 -1
  86. package/dist/meetings/meetings.types.js +7 -0
  87. package/dist/meetings/meetings.types.js.map +1 -0
  88. package/dist/meetings/request.js +2 -0
  89. package/dist/meetings/request.js.map +1 -1
  90. package/dist/meetings/util.js +88 -1
  91. package/dist/meetings/util.js.map +1 -1
  92. package/dist/member/index.js +49 -0
  93. package/dist/member/index.js.map +1 -1
  94. package/dist/member/types.js +25 -0
  95. package/dist/member/types.js.map +1 -0
  96. package/dist/member/util.js +121 -25
  97. package/dist/member/util.js.map +1 -1
  98. package/dist/members/collection.js +10 -0
  99. package/dist/members/collection.js.map +1 -1
  100. package/dist/members/index.js +86 -5
  101. package/dist/members/index.js.map +1 -1
  102. package/dist/members/request.js +106 -38
  103. package/dist/members/request.js.map +1 -1
  104. package/dist/members/types.js +15 -0
  105. package/dist/members/types.js.map +1 -0
  106. package/dist/members/util.js +316 -233
  107. package/dist/members/util.js.map +1 -1
  108. package/dist/metrics/constants.js +10 -5
  109. package/dist/metrics/constants.js.map +1 -1
  110. package/dist/metrics/index.js +1 -468
  111. package/dist/metrics/index.js.map +1 -1
  112. package/dist/multistream/mediaRequestManager.js +238 -49
  113. package/dist/multistream/mediaRequestManager.js.map +1 -1
  114. package/dist/multistream/receiveSlot.js +49 -16
  115. package/dist/multistream/receiveSlot.js.map +1 -1
  116. package/dist/multistream/receiveSlotManager.js +52 -34
  117. package/dist/multistream/receiveSlotManager.js.map +1 -1
  118. package/dist/multistream/remoteMedia.js +44 -18
  119. package/dist/multistream/remoteMedia.js.map +1 -1
  120. package/dist/multistream/remoteMediaGroup.js +60 -3
  121. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  122. package/dist/multistream/remoteMediaManager.js +209 -59
  123. package/dist/multistream/remoteMediaManager.js.map +1 -1
  124. package/dist/multistream/sendSlotManager.js +233 -0
  125. package/dist/multistream/sendSlotManager.js.map +1 -0
  126. package/dist/reachability/index.js +161 -57
  127. package/dist/reachability/index.js.map +1 -1
  128. package/dist/reachability/request.js +17 -8
  129. package/dist/reachability/request.js.map +1 -1
  130. package/dist/reconnection-manager/index.js +199 -154
  131. package/dist/reconnection-manager/index.js.map +1 -1
  132. package/dist/recording-controller/index.js +21 -2
  133. package/dist/recording-controller/index.js.map +1 -1
  134. package/dist/recording-controller/util.js +9 -8
  135. package/dist/recording-controller/util.js.map +1 -1
  136. package/dist/roap/index.js +23 -29
  137. package/dist/roap/index.js.map +1 -1
  138. package/dist/roap/request.js +112 -97
  139. package/dist/roap/request.js.map +1 -1
  140. package/dist/roap/turnDiscovery.js +96 -36
  141. package/dist/roap/turnDiscovery.js.map +1 -1
  142. package/dist/rtcMetrics/constants.js +12 -0
  143. package/dist/rtcMetrics/constants.js.map +1 -0
  144. package/dist/rtcMetrics/index.js +117 -0
  145. package/dist/rtcMetrics/index.js.map +1 -0
  146. package/dist/statsAnalyzer/index.js +51 -34
  147. package/dist/statsAnalyzer/index.js.map +1 -1
  148. package/dist/statsAnalyzer/mqaUtil.js +6 -6
  149. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  150. package/dist/types/annotation/annotation.types.d.ts +42 -0
  151. package/dist/types/annotation/constants.d.ts +31 -0
  152. package/dist/types/annotation/index.d.ts +117 -0
  153. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  154. package/dist/types/breakouts/events.d.ts +8 -0
  155. package/dist/types/breakouts/request.d.ts +22 -0
  156. package/dist/types/breakouts/utils.d.ts +15 -0
  157. package/dist/types/common/errors/webex-errors.d.ts +13 -1
  158. package/dist/types/common/queue.d.ts +9 -7
  159. package/dist/types/config.d.ts +1 -6
  160. package/dist/types/constants.d.ts +155 -21
  161. package/dist/types/controls-options-manager/enums.d.ts +11 -1
  162. package/dist/types/controls-options-manager/index.d.ts +17 -1
  163. package/dist/types/controls-options-manager/types.d.ts +43 -0
  164. package/dist/types/controls-options-manager/util.d.ts +1 -7
  165. package/dist/types/index.d.ts +6 -4
  166. package/dist/types/interpretation/collection.d.ts +5 -0
  167. package/dist/types/interpretation/index.d.ts +5 -0
  168. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  169. package/dist/types/locus-info/index.d.ts +57 -4
  170. package/dist/types/locus-info/parser.d.ts +65 -6
  171. package/dist/types/media/index.d.ts +2 -0
  172. package/dist/types/media/properties.d.ts +34 -48
  173. package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
  174. package/dist/types/meeting/index.d.ts +344 -506
  175. package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
  176. package/dist/types/meeting/muteState.d.ts +99 -23
  177. package/dist/types/meeting/request.d.ts +72 -43
  178. package/dist/types/meeting/util.d.ts +101 -1
  179. package/dist/types/meeting-info/index.d.ts +13 -1
  180. package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
  181. package/dist/types/meetings/collection.d.ts +8 -0
  182. package/dist/types/meetings/index.d.ts +86 -12
  183. package/dist/types/meetings/meetings.types.d.ts +4 -0
  184. package/dist/types/member/index.d.ts +13 -0
  185. package/dist/types/member/types.d.ts +32 -0
  186. package/dist/types/members/collection.d.ts +5 -0
  187. package/dist/types/members/index.d.ts +35 -2
  188. package/dist/types/members/request.d.ts +73 -9
  189. package/dist/types/members/types.d.ts +24 -0
  190. package/dist/types/members/util.d.ts +209 -1
  191. package/dist/types/metrics/constants.d.ts +9 -4
  192. package/dist/types/metrics/index.d.ts +4 -119
  193. package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
  194. package/dist/types/multistream/receiveSlot.d.ts +16 -12
  195. package/dist/types/multistream/receiveSlotManager.d.ts +19 -4
  196. package/dist/types/multistream/remoteMedia.d.ts +8 -29
  197. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  198. package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
  199. package/dist/types/multistream/sendSlotManager.d.ts +61 -0
  200. package/dist/types/reachability/index.d.ts +44 -7
  201. package/dist/types/reachability/request.d.ts +7 -3
  202. package/dist/types/reconnection-manager/index.d.ts +9 -0
  203. package/dist/types/recording-controller/index.d.ts +15 -1
  204. package/dist/types/recording-controller/util.d.ts +5 -4
  205. package/dist/types/roap/request.d.ts +15 -11
  206. package/dist/types/roap/turnDiscovery.d.ts +18 -1
  207. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  208. package/dist/types/rtcMetrics/index.d.ts +47 -0
  209. package/dist/types/statsAnalyzer/index.d.ts +6 -1
  210. package/package.json +23 -20
  211. package/src/annotation/annotation.types.ts +50 -0
  212. package/src/annotation/constants.ts +36 -0
  213. package/src/annotation/index.ts +328 -0
  214. package/src/breakouts/README.md +44 -14
  215. package/src/breakouts/breakout.ts +87 -9
  216. package/src/breakouts/edit-lock-error.ts +25 -0
  217. package/src/breakouts/events.ts +56 -0
  218. package/src/breakouts/index.ts +710 -10
  219. package/src/breakouts/request.ts +55 -0
  220. package/src/breakouts/utils.ts +57 -0
  221. package/src/common/errors/webex-errors.ts +27 -2
  222. package/src/common/logs/logger-proxy.ts +1 -1
  223. package/src/common/queue.ts +22 -8
  224. package/src/config.ts +4 -9
  225. package/src/constants.ts +178 -18
  226. package/src/controls-options-manager/enums.ts +12 -0
  227. package/src/controls-options-manager/index.ts +116 -21
  228. package/src/controls-options-manager/types.ts +59 -0
  229. package/src/controls-options-manager/util.ts +294 -14
  230. package/src/index.ts +40 -0
  231. package/src/interpretation/README.md +60 -0
  232. package/src/interpretation/collection.ts +19 -0
  233. package/src/interpretation/index.ts +332 -0
  234. package/src/interpretation/siLanguage.ts +18 -0
  235. package/src/locus-info/controlsUtils.ts +108 -0
  236. package/src/locus-info/index.ts +412 -59
  237. package/src/locus-info/infoUtils.ts +10 -2
  238. package/src/locus-info/mediaSharesUtils.ts +48 -0
  239. package/src/locus-info/parser.ts +231 -39
  240. package/src/locus-info/selfUtils.ts +81 -5
  241. package/src/media/index.ts +100 -122
  242. package/src/media/properties.ts +70 -108
  243. package/src/meeting/in-meeting-actions.ts +163 -3
  244. package/src/meeting/index.ts +2471 -2306
  245. package/src/meeting/locusMediaRequest.ts +313 -0
  246. package/src/meeting/muteState.ts +229 -131
  247. package/src/meeting/request.ts +172 -121
  248. package/src/meeting/util.ts +588 -394
  249. package/src/meeting-info/index.ts +79 -8
  250. package/src/meeting-info/meeting-info-v2.ts +168 -14
  251. package/src/meeting-info/util.ts +1 -1
  252. package/src/meeting-info/utilv2.ts +23 -23
  253. package/src/meetings/collection.ts +20 -0
  254. package/src/meetings/index.ts +414 -108
  255. package/src/meetings/meetings.types.ts +12 -0
  256. package/src/meetings/request.ts +2 -0
  257. package/src/meetings/util.ts +103 -4
  258. package/src/member/index.ts +49 -0
  259. package/src/member/types.ts +38 -0
  260. package/src/member/util.ts +127 -25
  261. package/src/members/collection.ts +8 -0
  262. package/src/members/index.ts +107 -6
  263. package/src/members/request.ts +97 -17
  264. package/src/members/types.ts +28 -0
  265. package/src/members/util.ts +319 -240
  266. package/src/metrics/constants.ts +9 -4
  267. package/src/metrics/index.ts +1 -490
  268. package/src/multistream/mediaRequestManager.ts +289 -79
  269. package/src/multistream/receiveSlot.ts +55 -18
  270. package/src/multistream/receiveSlotManager.ts +46 -24
  271. package/src/multistream/remoteMedia.ts +27 -2
  272. package/src/multistream/remoteMediaGroup.ts +59 -0
  273. package/src/multistream/remoteMediaManager.ts +148 -30
  274. package/src/multistream/sendSlotManager.ts +170 -0
  275. package/src/reachability/index.ts +165 -37
  276. package/src/reachability/request.ts +17 -8
  277. package/src/reconnection-manager/index.ts +81 -54
  278. package/src/recording-controller/index.ts +20 -3
  279. package/src/recording-controller/util.ts +26 -9
  280. package/src/roap/index.ts +23 -30
  281. package/src/roap/request.ts +100 -104
  282. package/src/roap/turnDiscovery.ts +51 -25
  283. package/src/rtcMetrics/constants.ts +3 -0
  284. package/src/rtcMetrics/index.ts +100 -0
  285. package/src/statsAnalyzer/index.ts +73 -35
  286. package/src/statsAnalyzer/mqaUtil.ts +8 -10
  287. package/test/integration/spec/converged-space-meetings.js +233 -0
  288. package/test/integration/spec/journey.js +320 -261
  289. package/test/integration/spec/space-meeting.js +76 -3
  290. package/test/unit/spec/annotation/index.ts +418 -0
  291. package/test/unit/spec/breakouts/breakout.ts +142 -24
  292. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  293. package/test/unit/spec/breakouts/events.ts +89 -0
  294. package/test/unit/spec/breakouts/index.ts +1545 -48
  295. package/test/unit/spec/breakouts/request.ts +104 -0
  296. package/test/unit/spec/breakouts/utils.js +72 -0
  297. package/test/unit/spec/common/queue.js +31 -2
  298. package/test/unit/spec/controls-options-manager/index.js +163 -0
  299. package/test/unit/spec/controls-options-manager/util.js +576 -60
  300. package/test/unit/spec/fixture/locus.js +1 -0
  301. package/test/unit/spec/interpretation/collection.ts +15 -0
  302. package/test/unit/spec/interpretation/index.ts +589 -0
  303. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  304. package/test/unit/spec/locus-info/controlsUtils.js +316 -43
  305. package/test/unit/spec/locus-info/index.js +1283 -33
  306. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  307. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  308. package/test/unit/spec/locus-info/parser.js +62 -22
  309. package/test/unit/spec/locus-info/selfConstant.js +27 -4
  310. package/test/unit/spec/locus-info/selfUtils.js +208 -17
  311. package/test/unit/spec/media/index.ts +104 -37
  312. package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
  313. package/test/unit/spec/meeting/index.js +4095 -1913
  314. package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
  315. package/test/unit/spec/meeting/muteState.js +408 -208
  316. package/test/unit/spec/meeting/request.js +440 -45
  317. package/test/unit/spec/meeting/utils.js +679 -64
  318. package/test/unit/spec/meeting-info/index.js +293 -0
  319. package/test/unit/spec/meeting-info/meetinginfov2.js +517 -5
  320. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  321. package/test/unit/spec/meetings/collection.js +14 -0
  322. package/test/unit/spec/meetings/index.js +941 -151
  323. package/test/unit/spec/meetings/utils.js +206 -2
  324. package/test/unit/spec/member/index.js +58 -4
  325. package/test/unit/spec/member/util.js +479 -35
  326. package/test/unit/spec/members/index.js +319 -1
  327. package/test/unit/spec/members/request.js +206 -27
  328. package/test/unit/spec/members/utils.js +184 -0
  329. package/test/unit/spec/metrics/index.js +1 -50
  330. package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
  331. package/test/unit/spec/multistream/receiveSlot.ts +72 -13
  332. package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
  333. package/test/unit/spec/multistream/remoteMedia.ts +30 -0
  334. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  335. package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
  336. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  337. package/test/unit/spec/reachability/index.ts +343 -9
  338. package/test/unit/spec/reachability/request.js +68 -0
  339. package/test/unit/spec/reconnection-manager/index.js +84 -9
  340. package/test/unit/spec/recording-controller/index.js +294 -218
  341. package/test/unit/spec/recording-controller/util.js +223 -96
  342. package/test/unit/spec/roap/index.ts +31 -51
  343. package/test/unit/spec/roap/request.ts +203 -85
  344. package/test/unit/spec/roap/turnDiscovery.ts +48 -13
  345. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  346. package/test/unit/spec/stats-analyzer/index.js +29 -2
  347. package/test/utils/constants.js +9 -0
  348. package/test/utils/integrationTestUtils.js +46 -0
  349. package/test/utils/testUtils.js +0 -45
  350. package/test/utils/webex-config.js +4 -0
  351. package/test/utils/webex-test-users.js +6 -3
  352. package/dist/meeting/effectsState.js +0 -262
  353. package/dist/meeting/effectsState.js.map +0 -1
  354. package/dist/metrics/config.js +0 -299
  355. package/dist/metrics/config.js.map +0 -1
  356. package/dist/types/meeting/effectsState.d.ts +0 -42
  357. package/dist/types/metrics/config.d.ts +0 -178
  358. package/src/index.js +0 -16
  359. package/src/meeting/effectsState.ts +0 -211
  360. package/src/metrics/config.ts +0 -495
  361. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -3,16 +3,29 @@
3
3
  */
4
4
  /* globals navigator */
5
5
 
6
- import {RoapMediaConnection, MultistreamRoapMediaConnection} from '@webex/internal-media-core';
6
+ import {
7
+ RoapMediaConnection,
8
+ MultistreamRoapMediaConnection,
9
+ type MultistreamConnectionConfig,
10
+ } from '@webex/internal-media-core';
11
+ import {
12
+ LocalStream,
13
+ LocalCameraStream,
14
+ LocalDisplayStream,
15
+ LocalSystemAudioStream,
16
+ LocalMicrophoneStream,
17
+ } from '@webex/media-helpers';
7
18
  import LoggerProxy from '../common/logs/logger-proxy';
8
- import {AUDIO_INPUT, VIDEO_INPUT, MEDIA_TRACK_CONSTRAINT} from '../constants';
19
+ import {MEDIA_TRACK_CONSTRAINT} from '../constants';
9
20
  import Config from '../config';
10
21
  import StaticConfig from '../common/config';
11
- import MediaError from '../common/errors/media';
12
22
  import BrowserDetection from '../common/browser-detection';
23
+ import RtcMetrics from '../rtcMetrics';
13
24
 
14
25
  const {isBrowser} = BrowserDetection();
15
26
 
27
+ export type BundlePolicy = MultistreamConnectionConfig['bundlePolicy'];
28
+
16
29
  /**
17
30
  * MediaDirection
18
31
  * @typedef {Object} MediaDirection
@@ -43,45 +56,6 @@ const {isBrowser} = BrowserDetection();
43
56
  */
44
57
  const Media: any = {};
45
58
 
46
- /**
47
- * @param {boolean} enabled
48
- * @param {MediaStreamTrack} track
49
- * @returns {Boolean}
50
- * @public
51
- */
52
- Media.setLocalTrack = (enabled: boolean, track: MediaStreamTrack) => {
53
- if (track) {
54
- track.enabled = enabled;
55
-
56
- return true;
57
- }
58
-
59
- return false;
60
- };
61
-
62
- /**
63
- * format the media array for send
64
- * @param {String} mediaId
65
- * @param {Boolean} audioMuted
66
- * @param {Boolean} videoMuted
67
- * @returns {Array} medias
68
- */
69
- Media.generateLocalMedias = (mediaId: string, audioMuted: boolean, videoMuted: boolean) => {
70
- if (mediaId) {
71
- return [
72
- {
73
- localSdp: JSON.stringify({
74
- audioMuted,
75
- videoMuted,
76
- }),
77
- mediaId,
78
- },
79
- ];
80
- }
81
-
82
- return [];
83
- };
84
-
85
59
  /**
86
60
  * make a browser call to get the media
87
61
  * @param {SendOptions} options
@@ -109,33 +83,60 @@ Media.getLocalMedia = (options: any, config: object) => {
109
83
  return Promise.resolve(undefined);
110
84
  };
111
85
 
86
+ Media.getDirection = (forceSendRecv: boolean, receive: boolean, send: boolean) => {
87
+ if (!receive && !send) {
88
+ return 'inactive';
89
+ }
90
+
91
+ if (forceSendRecv || (receive && send)) {
92
+ return 'sendrecv';
93
+ }
94
+
95
+ if (receive) {
96
+ return 'recvonly';
97
+ }
98
+
99
+ return 'sendonly';
100
+ };
101
+
112
102
  /**
113
103
  * creates a webrtc media connection with provided tracks and mediaDirection configuration
114
104
  *
115
105
  * @param {boolean} isMultistream
116
106
  * @param {string} debugId string useful for debugging (will appear in media connection logs)
107
+ * @param {object} webex main `webex` object.
108
+ * @param {string} meetingId id for the meeting using this connection
109
+ * @param {string} correlationId id used in requests to correlate to this session
117
110
  * @param {Object} options
118
- * @param {Object} [options.mediaProperties] only applicable to non-multistream connections, contains mediaDirection and local tracks:
119
- * audioTrack, videoTrack and shareTrack
111
+ * @param {Object} [options.mediaProperties] contains mediaDirection and local tracks:
112
+ * audioTrack, videoTrack, shareVideoTrack, and shareAudioTrack
120
113
  * @param {string} [options.remoteQualityLevel] LOW|MEDIUM|HIGH applicable only to non-multistream connections
121
114
  * @param {boolean} [options.enableRtx] applicable only to non-multistream connections
122
115
  * @param {boolean} [options.enableExtmap] applicable only to non-multistream connections
123
116
  * @param {Object} [options.turnServerInfo]
124
- * @returns {RoapMediaConnection}
117
+ * @param {BundlePolicy} [options.bundlePolicy]
118
+ * @returns {RoapMediaConnection | MultistreamRoapMediaConnection}
125
119
  */
126
120
  Media.createMediaConnection = (
127
121
  isMultistream: boolean,
128
122
  debugId: string,
123
+ webex: object,
124
+ meetingId: string,
125
+ correlationId: string,
129
126
  options: {
130
- mediaProperties?: {
127
+ mediaProperties: {
131
128
  mediaDirection?: {
132
129
  receiveAudio: boolean;
133
130
  receiveVideo: boolean;
134
131
  receiveShare: boolean;
132
+ sendAudio: boolean;
133
+ sendVideo: boolean;
134
+ sendShare: boolean;
135
135
  };
136
- audioTrack?: MediaStreamTrack;
137
- videoTrack?: MediaStreamTrack;
138
- shareTrack?: MediaStreamTrack;
136
+ audioStream?: LocalMicrophoneStream;
137
+ videoStream?: LocalCameraStream;
138
+ shareVideoStream?: LocalDisplayStream;
139
+ shareAudioStream?: LocalSystemAudioStream;
139
140
  };
140
141
  remoteQualityLevel?: 'LOW' | 'MEDIUM' | 'HIGH';
141
142
  enableRtx?: boolean;
@@ -145,9 +146,17 @@ Media.createMediaConnection = (
145
146
  username: string;
146
147
  password: string;
147
148
  };
149
+ bundlePolicy?: BundlePolicy;
148
150
  }
149
151
  ) => {
150
- const {mediaProperties, remoteQualityLevel, enableRtx, enableExtmap, turnServerInfo} = options;
152
+ const {
153
+ mediaProperties,
154
+ remoteQualityLevel,
155
+ enableRtx,
156
+ enableExtmap,
157
+ turnServerInfo,
158
+ bundlePolicy,
159
+ } = options;
151
160
 
152
161
  const iceServers = [];
153
162
 
@@ -160,11 +169,21 @@ Media.createMediaConnection = (
160
169
  }
161
170
 
162
171
  if (isMultistream) {
172
+ const config: MultistreamConnectionConfig = {
173
+ iceServers,
174
+ };
175
+
176
+ if (bundlePolicy) {
177
+ config.bundlePolicy = bundlePolicy;
178
+ }
179
+
180
+ const rtcMetrics = new RtcMetrics(webex, meetingId, correlationId);
181
+
163
182
  return new MultistreamRoapMediaConnection(
164
- {
165
- iceServers,
166
- },
167
- debugId
183
+ config,
184
+ meetingId,
185
+ (data) => rtcMetrics.addMetrics(data),
186
+ () => rtcMetrics.closeMetrics()
168
187
  );
169
188
  }
170
189
 
@@ -172,7 +191,8 @@ Media.createMediaConnection = (
172
191
  throw new Error('mediaProperties have to be provided for non-multistream media connections');
173
192
  }
174
193
 
175
- const {mediaDirection, audioTrack, videoTrack, shareTrack} = mediaProperties;
194
+ const {mediaDirection, audioStream, videoStream, shareVideoStream, shareAudioStream} =
195
+ mediaProperties;
176
196
 
177
197
  return new RoapMediaConnection(
178
198
  {
@@ -193,17 +213,23 @@ Media.createMediaConnection = (
193
213
  },
194
214
  },
195
215
  {
196
- send: {
197
- audio: audioTrack,
198
- video: videoTrack,
199
- screenShareVideo: shareTrack,
200
- },
201
- receive: {
202
- audio: mediaDirection.receiveAudio,
203
- video: mediaDirection.receiveVideo,
204
- screenShareVideo: mediaDirection.receiveShare,
205
- remoteQualityLevel,
216
+ // TODO: RoapMediaConnection is not ready to use stream classes yet, so we pass the raw MediaStreamTrack for now SPARK-460530
217
+ localTracks: {
218
+ audio: audioStream?.outputTrack,
219
+ video: videoStream?.outputTrack,
220
+ screenShareVideo: shareVideoStream?.outputTrack,
221
+ screenShareAudio: shareAudioStream?.outputTrack, // TODO: add type for screenShareAudio in internal-media-core SPARK-446923
222
+ } as unknown,
223
+ direction: {
224
+ audio: Media.getDirection(true, mediaDirection.receiveAudio, mediaDirection.sendAudio),
225
+ video: Media.getDirection(true, mediaDirection.receiveVideo, mediaDirection.sendVideo),
226
+ screenShareVideo: Media.getDirection(
227
+ false,
228
+ mediaDirection.receiveShare,
229
+ mediaDirection.sendShare
230
+ ),
206
231
  },
232
+ remoteQualityLevel,
207
233
  },
208
234
  debugId
209
235
  );
@@ -348,52 +374,6 @@ Media.getMedia = (audio: any | boolean, video: any | boolean, config: any) => {
348
374
  });
349
375
  };
350
376
 
351
- /**
352
- * Checks if the machine has at least one audio or video device (Dont use this for screen share)
353
- * @param {object} [options]
354
- * {
355
- * sendAudio: true/false,
356
- * sendVideo: true/false
357
- * }
358
- * @returns {Object} {
359
- * sendAudio: true/false,
360
- * sendVideo: true/false
361
- *}
362
- */
363
- Media.getSupportedDevice = ({sendAudio, sendVideo}: {sendAudio: boolean; sendVideo: boolean}) =>
364
- Promise.resolve().then(() => {
365
- if (!navigator.mediaDevices || navigator.mediaDevices.enumerateDevices === undefined) {
366
- return {
367
- sendAudio: false,
368
- sendVideo: false,
369
- };
370
- }
371
-
372
- return navigator.mediaDevices.enumerateDevices().then((devices) => {
373
- const supported = {
374
- audio: devices.filter((device) => device.kind === AUDIO_INPUT).length > 0,
375
- video: devices.filter((device) => device.kind === VIDEO_INPUT).length > 0,
376
- };
377
-
378
- return {
379
- sendAudio: supported.audio && sendAudio,
380
- sendVideo: supported.video && sendVideo,
381
- };
382
- });
383
- });
384
-
385
- /**
386
- * proxy to browser navigator.mediaDevices.enumerateDevices()
387
- * @returns {Promise}
388
- */
389
- Media.getDevices = () => {
390
- if (navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
391
- return navigator.mediaDevices.enumerateDevices();
392
- }
393
-
394
- return Promise.reject(new MediaError('enumerateDevices not supported.'));
395
- };
396
-
397
377
  /**
398
378
  *
399
379
  * Toggle a specific stream
@@ -404,23 +384,21 @@ Media.toggleStream = () => {};
404
384
 
405
385
  /**
406
386
  * Stop input stream
407
- * @param {MediaTrack} track A media stream
387
+ * @param {LocalStream} stream A local stream
408
388
  * @returns {null}
409
389
  */
410
- Media.stopTracks = (track: any) => {
411
- if (!track) {
390
+ Media.stopStream = (stream: LocalStream) => {
391
+ if (!stream) {
412
392
  return Promise.resolve();
413
393
  }
414
394
 
415
395
  return Promise.resolve().then(() => {
416
- if (track && track.stop) {
417
- try {
418
- track.stop();
419
- } catch (e) {
420
- LoggerProxy.logger.error(
421
- `Media:index#stopTracks --> Unable to stop the track with state ${track.readyState}, error: ${e}`
422
- );
423
- }
396
+ try {
397
+ stream.stop();
398
+ } catch (e) {
399
+ LoggerProxy.logger.error(
400
+ `Media:index#stopStream --> Unable to stop the stream with ready state of the output track => ${stream.outputTrack.readyState} & input track => ${stream.inputTrack.readyState}, error: ${e}`
401
+ );
424
402
  }
425
403
  });
426
404
  };
@@ -1,41 +1,65 @@
1
1
  import {ConnectionState, Event} from '@webex/internal-media-core';
2
2
 
3
+ import {
4
+ LocalCameraStream,
5
+ LocalMicrophoneStream,
6
+ LocalDisplayStream,
7
+ LocalSystemAudioStream,
8
+ RemoteStream,
9
+ } from '@webex/media-helpers';
10
+
3
11
  import {MEETINGS, PC_BAIL_TIMEOUT, QUALITY_LEVELS} from '../constants';
4
12
  import LoggerProxy from '../common/logs/logger-proxy';
5
13
 
14
+ export type MediaDirection = {
15
+ sendAudio: boolean;
16
+ sendVideo: boolean;
17
+ sendShare: boolean;
18
+ receiveAudio: boolean;
19
+ receiveVideo: boolean;
20
+ receiveShare: boolean;
21
+ };
22
+
6
23
  /**
7
24
  * @class MediaProperties
8
25
  */
9
26
  export default class MediaProperties {
10
- audioTrack: any;
11
- localQualityLevel: any;
12
- mediaDirection: any;
27
+ audioStream?: LocalMicrophoneStream;
28
+ mediaDirection: MediaDirection;
13
29
  mediaSettings: any;
14
30
  webrtcMediaConnection: any;
15
- remoteAudioTrack: any;
31
+ remoteAudioStream: RemoteStream;
16
32
  remoteQualityLevel: any;
17
- remoteShare: any;
18
- remoteVideoTrack: any;
19
- shareTrack: any;
33
+ remoteShareStream: RemoteStream;
34
+ remoteVideoStream: RemoteStream;
35
+ shareVideoStream?: LocalDisplayStream;
36
+ shareAudioStream?: LocalSystemAudioStream;
20
37
  videoDeviceId: any;
21
- videoTrack: any;
38
+ videoStream?: LocalCameraStream;
22
39
  namespace = MEETINGS;
23
40
 
24
41
  /**
25
42
  * @param {Object} [options] -- to auto construct
26
43
  * @returns {MediaProperties}
27
44
  */
28
- constructor(options: any = {}) {
45
+ constructor() {
29
46
  this.webrtcMediaConnection = null;
30
- this.mediaDirection = options.mediaDirection;
31
- this.videoTrack = options.videoTrack;
32
- this.audioTrack = options.audioTrack;
33
- this.shareTrack = options.shareTrack;
34
- this.remoteShare = options.remoteShare;
35
- this.remoteAudioTrack = options.remoteAudioTrack;
36
- this.remoteVideoTrack = options.remoteVideoTrack;
37
- this.localQualityLevel = options.localQualityLevel || QUALITY_LEVELS['720p'];
38
- this.remoteQualityLevel = options.remoteQualityLevel || QUALITY_LEVELS.HIGH;
47
+ this.mediaDirection = {
48
+ receiveAudio: false,
49
+ receiveVideo: false,
50
+ receiveShare: false,
51
+ sendAudio: false,
52
+ sendVideo: false,
53
+ sendShare: false,
54
+ };
55
+ this.videoStream = null;
56
+ this.audioStream = null;
57
+ this.shareVideoStream = null;
58
+ this.shareAudioStream = null;
59
+ this.remoteShareStream = undefined;
60
+ this.remoteAudioStream = undefined;
61
+ this.remoteVideoStream = undefined;
62
+ this.remoteQualityLevel = QUALITY_LEVELS.HIGH;
39
63
  this.mediaSettings = {};
40
64
  this.videoDeviceId = null;
41
65
  }
@@ -60,46 +84,46 @@ export default class MediaProperties {
60
84
  this.webrtcMediaConnection = mediaPeerConnection;
61
85
  }
62
86
 
63
- setLocalVideoTrack(videoTrack) {
64
- this.videoTrack = videoTrack;
87
+ setLocalVideoStream(videoStream?: LocalCameraStream) {
88
+ this.videoStream = videoStream;
65
89
  }
66
90
 
67
- setLocalAudioTrack(audioTrack) {
68
- this.audioTrack = audioTrack;
91
+ setLocalAudioStream(audioStream?: LocalMicrophoneStream) {
92
+ this.audioStream = audioStream;
69
93
  }
70
94
 
71
- setLocalQualityLevel(localQualityLevel) {
72
- this.localQualityLevel = localQualityLevel;
95
+ setLocalShareVideoStream(shareVideoStream?: LocalDisplayStream) {
96
+ this.shareVideoStream = shareVideoStream;
73
97
  }
74
98
 
75
- setLocalShareTrack(shareTrack) {
76
- this.shareTrack = shareTrack;
99
+ setLocalShareAudioStream(shareAudioStream?: LocalSystemAudioStream) {
100
+ this.shareAudioStream = shareAudioStream;
77
101
  }
78
102
 
79
103
  setRemoteQualityLevel(remoteQualityLevel) {
80
104
  this.remoteQualityLevel = remoteQualityLevel;
81
105
  }
82
106
 
83
- setRemoteShare(remoteShare) {
84
- this.remoteShare = remoteShare;
107
+ setRemoteShareStream(remoteShareStream: RemoteStream) {
108
+ this.remoteShareStream = remoteShareStream;
85
109
  }
86
110
 
87
111
  /**
88
- * Sets the remote audio track
89
- * @param {MediaTrack} remoteAudioTrack MediaTrack to save
112
+ * Sets the remote audio stream
113
+ * @param {RemoteStream} remoteAudioStream RemoteStream to save
90
114
  * @returns {void}
91
115
  */
92
- setRemoteAudioTrack(remoteAudioTrack: any) {
93
- this.remoteAudioTrack = remoteAudioTrack;
116
+ setRemoteAudioStream(remoteAudioStream: RemoteStream) {
117
+ this.remoteAudioStream = remoteAudioStream;
94
118
  }
95
119
 
96
120
  /**
97
- * Sets the remote video track
98
- * @param {MediaTrack} remoteVideoTrack MediaTrack to save
121
+ * Sets the remote video stream
122
+ * @param {RemoteStream} remoteVideoStream RemoteStream to save
99
123
  * @returns {void}
100
124
  */
101
- setRemoteVideoTrack(remoteVideoTrack: any) {
102
- this.remoteVideoTrack = remoteVideoTrack;
125
+ setRemoteVideoStream(remoteVideoStream: RemoteStream) {
126
+ this.remoteVideoStream = remoteVideoStream;
103
127
  }
104
128
 
105
129
  /**
@@ -115,96 +139,34 @@ export default class MediaProperties {
115
139
  this.webrtcMediaConnection = null;
116
140
  }
117
141
 
118
- unsetLocalVideoTrack() {
119
- this.videoTrack = null;
120
- }
121
-
122
- unsetLocalShareTrack() {
123
- this.shareTrack = null;
124
- }
125
-
126
- unsetLocalAudioTrack() {
127
- this.audioTrack = null;
128
- }
129
-
130
- /**
131
- * Removes remote stream from class instance
132
- * @deprecated after v1.89.3
133
- * @returns {void}
134
- */
135
- unsetRemoteStream() {
136
- LoggerProxy.logger.warn(
137
- 'Media:properties#unsetRemoteStream --> [DEPRECATION WARNING]: unsetRemoteStream has been deprecated after v1.89.3 (use unsetRemoteTracks instead)'
138
- );
139
- // unsets audio and video only
140
- this.unsetRemoteMedia();
141
- }
142
-
143
142
  /**
144
143
  * Removes both remote audio and video from class instance
145
144
  * @returns {void}
146
145
  */
147
146
  unsetRemoteMedia() {
148
- this.remoteAudioTrack = null;
149
- this.remoteVideoTrack = null;
150
- }
151
-
152
- unsetRemoteShare() {
153
- this.remoteShare = null;
147
+ this.remoteAudioStream = null;
148
+ this.remoteVideoStream = null;
154
149
  }
155
150
 
156
- unsetLocalVideoTracks() {
157
- this.unsetLocalVideoTrack();
158
- this.unsetLocalShareTrack();
151
+ unsetRemoteShareStream() {
152
+ this.remoteShareStream = null;
159
153
  }
160
154
 
161
155
  /**
162
- * Removes remote stream and remote share from class instance
163
- * @deprecated after v1.89.3
156
+ * Unsets all remote streams
164
157
  * @returns {void}
165
158
  */
166
159
  unsetRemoteStreams() {
167
- LoggerProxy.logger.warn(
168
- 'Media:properties#unsetRemoteStreams --> [DEPRECATION WARNING]: unsetRemoteStreams has been deprecated after v1.89.3 (use unsetRemoteTracks instead)'
169
- );
170
- this.unsetRemoteStream();
171
- this.unsetRemoteShare();
172
- }
173
-
174
- /**
175
- * Unsets all remote tracks
176
- * @returns {void}
177
- */
178
- unsetRemoteTracks() {
179
160
  this.unsetRemoteMedia();
180
- this.unsetRemoteShare();
181
- }
182
-
183
- unsetShareStreams() {
184
- this.unsetLocalShareTrack();
185
- this.unsetRemoteShare();
161
+ this.unsetRemoteShareStream();
186
162
  }
187
163
 
188
164
  /**
189
- * Removes both local and remote video stream from class instance
190
- * @deprecated after v1.89.3
191
- * @returns {void}
192
- */
193
- unsetMediaStreams() {
194
- LoggerProxy.logger.warn(
195
- 'Media:properties#unsetMediaStreams --> [DEPRECATION WARNING]: unsetMediaStreams has been deprecated after v1.89.3 (use unsetMediaTracks instead)'
196
- );
197
- this.unsetLocalVideoTrack();
198
- this.unsetRemoteStream();
199
- }
200
-
201
- /**
202
- * Removes both local and remote video stream from class instance
203
- * @returns {void}
165
+ * Returns if we have at least one local share stream or not.
166
+ * @returns {Boolean}
204
167
  */
205
- unsetMediaTracks() {
206
- this.unsetLocalVideoTrack();
207
- this.unsetRemoteMedia();
168
+ hasLocalShareStream() {
169
+ return !!(this.shareAudioStream || this.shareVideoStream);
208
170
  }
209
171
 
210
172
  /**