@webex/plugin-meetings 3.0.0-beta.14 → 3.0.0-beta.16

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 (311) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/common/browser-detection.js +1 -20
  4. package/dist/common/browser-detection.js.map +1 -1
  5. package/dist/common/collection.js +5 -20
  6. package/dist/common/collection.js.map +1 -1
  7. package/dist/common/config.js +0 -7
  8. package/dist/common/config.js.map +1 -1
  9. package/dist/common/errors/captcha-error.js +5 -26
  10. package/dist/common/errors/captcha-error.js.map +1 -1
  11. package/dist/common/errors/intent-to-join.js +5 -26
  12. package/dist/common/errors/intent-to-join.js.map +1 -1
  13. package/dist/common/errors/join-meeting.js +6 -27
  14. package/dist/common/errors/join-meeting.js.map +1 -1
  15. package/dist/common/errors/media.js +5 -26
  16. package/dist/common/errors/media.js.map +1 -1
  17. package/dist/common/errors/parameter.js +5 -33
  18. package/dist/common/errors/parameter.js.map +1 -1
  19. package/dist/common/errors/password-error.js +5 -26
  20. package/dist/common/errors/password-error.js.map +1 -1
  21. package/dist/common/errors/permission.js +4 -25
  22. package/dist/common/errors/permission.js.map +1 -1
  23. package/dist/common/errors/reconnection-in-progress.js +0 -17
  24. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  25. package/dist/common/errors/reconnection.js +5 -26
  26. package/dist/common/errors/reconnection.js.map +1 -1
  27. package/dist/common/errors/stats.js +5 -26
  28. package/dist/common/errors/stats.js.map +1 -1
  29. package/dist/common/errors/webex-errors.js +6 -41
  30. package/dist/common/errors/webex-errors.js.map +1 -1
  31. package/dist/common/errors/webex-meetings-error.js +1 -24
  32. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  33. package/dist/common/events/events-scope.js +0 -22
  34. package/dist/common/events/events-scope.js.map +1 -1
  35. package/dist/common/events/events.js +0 -23
  36. package/dist/common/events/events.js.map +1 -1
  37. package/dist/common/events/trigger-proxy.js +0 -12
  38. package/dist/common/events/trigger-proxy.js.map +1 -1
  39. package/dist/common/events/util.js +0 -15
  40. package/dist/common/events/util.js.map +1 -1
  41. package/dist/common/logs/logger-config.js +0 -4
  42. package/dist/common/logs/logger-config.js.map +1 -1
  43. package/dist/common/logs/logger-proxy.js +1 -8
  44. package/dist/common/logs/logger-proxy.js.map +1 -1
  45. package/dist/common/logs/request.js +35 -61
  46. package/dist/common/logs/request.js.map +1 -1
  47. package/dist/common/queue.js +4 -14
  48. package/dist/common/queue.js.map +1 -1
  49. package/dist/config.js +1 -5
  50. package/dist/config.js.map +1 -1
  51. package/dist/constants.js +45 -40
  52. package/dist/constants.js.map +1 -1
  53. package/dist/index.js +1 -17
  54. package/dist/index.js.map +1 -1
  55. package/dist/locus-info/controlsUtils.js +10 -28
  56. package/dist/locus-info/controlsUtils.js.map +1 -1
  57. package/dist/locus-info/embeddedAppsUtils.js +3 -26
  58. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  59. package/dist/locus-info/fullState.js +0 -15
  60. package/dist/locus-info/fullState.js.map +1 -1
  61. package/dist/locus-info/hostUtils.js +4 -12
  62. package/dist/locus-info/hostUtils.js.map +1 -1
  63. package/dist/locus-info/index.js +101 -193
  64. package/dist/locus-info/index.js.map +1 -1
  65. package/dist/locus-info/infoUtils.js +0 -38
  66. package/dist/locus-info/infoUtils.js.map +1 -1
  67. package/dist/locus-info/mediaSharesUtils.js +12 -38
  68. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  69. package/dist/locus-info/parser.js +87 -123
  70. package/dist/locus-info/parser.js.map +1 -1
  71. package/dist/locus-info/selfUtils.js +16 -81
  72. package/dist/locus-info/selfUtils.js.map +1 -1
  73. package/dist/media/index.js +43 -97
  74. package/dist/media/index.js.map +1 -1
  75. package/dist/media/internal-media-core-wrapper.js +0 -4
  76. package/dist/media/internal-media-core-wrapper.js.map +1 -1
  77. package/dist/media/properties.js +64 -110
  78. package/dist/media/properties.js.map +1 -1
  79. package/dist/media/util.js +2 -9
  80. package/dist/media/util.js.map +1 -1
  81. package/dist/mediaQualityMetrics/config.js +10 -12
  82. package/dist/mediaQualityMetrics/config.js.map +1 -1
  83. package/dist/meeting/effectsState.js +120 -192
  84. package/dist/meeting/effectsState.js.map +1 -1
  85. package/dist/meeting/in-meeting-actions.js +0 -13
  86. package/dist/meeting/in-meeting-actions.js.map +1 -1
  87. package/dist/meeting/index.js +819 -1591
  88. package/dist/meeting/index.js.map +1 -1
  89. package/dist/meeting/muteState.js +31 -78
  90. package/dist/meeting/muteState.js.map +1 -1
  91. package/dist/meeting/request.js +160 -230
  92. package/dist/meeting/request.js.map +1 -1
  93. package/dist/meeting/request.type.js +0 -1
  94. package/dist/meeting/request.type.js.map +1 -1
  95. package/dist/meeting/state.js +21 -31
  96. package/dist/meeting/state.js.map +1 -1
  97. package/dist/meeting/util.js +19 -158
  98. package/dist/meeting/util.js.map +1 -1
  99. package/dist/meeting-info/collection.js +3 -25
  100. package/dist/meeting-info/collection.js.map +1 -1
  101. package/dist/meeting-info/index.js +10 -33
  102. package/dist/meeting-info/index.js.map +1 -1
  103. package/dist/meeting-info/meeting-info-v2.js +179 -268
  104. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  105. package/dist/meeting-info/request.js +1 -16
  106. package/dist/meeting-info/request.js.map +1 -1
  107. package/dist/meeting-info/util.js +98 -183
  108. package/dist/meeting-info/util.js.map +1 -1
  109. package/dist/meeting-info/utilv2.js +137 -228
  110. package/dist/meeting-info/utilv2.js.map +1 -1
  111. package/dist/meetings/collection.js +3 -21
  112. package/dist/meetings/collection.js.map +1 -1
  113. package/dist/meetings/index.js +450 -582
  114. package/dist/meetings/index.js.map +1 -1
  115. package/dist/meetings/request.js +7 -30
  116. package/dist/meetings/request.js.map +1 -1
  117. package/dist/meetings/util.js +99 -155
  118. package/dist/meetings/util.js.map +1 -1
  119. package/dist/member/index.js +49 -89
  120. package/dist/member/index.js.map +1 -1
  121. package/dist/member/util.js +17 -68
  122. package/dist/member/util.js.map +1 -1
  123. package/dist/members/collection.js +2 -12
  124. package/dist/members/collection.js.map +1 -1
  125. package/dist/members/index.js +72 -194
  126. package/dist/members/index.js.map +1 -1
  127. package/dist/members/request.js +21 -56
  128. package/dist/members/request.js.map +1 -1
  129. package/dist/members/util.js +9 -38
  130. package/dist/members/util.js.map +1 -1
  131. package/dist/metrics/config.js +0 -2
  132. package/dist/metrics/config.js.map +1 -1
  133. package/dist/metrics/constants.js +1 -2
  134. package/dist/metrics/constants.js.map +1 -1
  135. package/dist/metrics/index.js +48 -136
  136. package/dist/metrics/index.js.map +1 -1
  137. package/dist/multistream/mediaRequestManager.js +12 -28
  138. package/dist/multistream/mediaRequestManager.js.map +1 -1
  139. package/dist/multistream/multistreamMedia.js +11 -21
  140. package/dist/multistream/multistreamMedia.js.map +1 -1
  141. package/dist/multistream/receiveSlot.js +7 -47
  142. package/dist/multistream/receiveSlot.js.map +1 -1
  143. package/dist/multistream/receiveSlotManager.js +38 -77
  144. package/dist/multistream/receiveSlotManager.js.map +1 -1
  145. package/dist/multistream/remoteMedia.js +11 -56
  146. package/dist/multistream/remoteMedia.js.map +1 -1
  147. package/dist/multistream/remoteMediaGroup.js +6 -40
  148. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  149. package/dist/multistream/remoteMediaManager.js +221 -380
  150. package/dist/multistream/remoteMediaManager.js.map +1 -1
  151. package/dist/networkQualityMonitor/index.js +28 -57
  152. package/dist/networkQualityMonitor/index.js.map +1 -1
  153. package/dist/personal-meeting-room/index.js +10 -45
  154. package/dist/personal-meeting-room/index.js.map +1 -1
  155. package/dist/personal-meeting-room/request.js +2 -33
  156. package/dist/personal-meeting-room/request.js.map +1 -1
  157. package/dist/personal-meeting-room/util.js +0 -13
  158. package/dist/personal-meeting-room/util.js.map +1 -1
  159. package/dist/reachability/index.js +100 -166
  160. package/dist/reachability/index.js.map +1 -1
  161. package/dist/reachability/request.js +2 -18
  162. package/dist/reachability/request.js.map +1 -1
  163. package/dist/reactions/reactions.js +0 -2
  164. package/dist/reactions/reactions.js.map +1 -1
  165. package/dist/reactions/reactions.type.js +2 -6
  166. package/dist/reactions/reactions.type.js.map +1 -1
  167. package/dist/reconnection-manager/index.js +294 -459
  168. package/dist/reconnection-manager/index.js.map +1 -1
  169. package/dist/roap/index.js +18 -53
  170. package/dist/roap/index.js.map +1 -1
  171. package/dist/roap/request.js +13 -55
  172. package/dist/roap/request.js.map +1 -1
  173. package/dist/roap/turnDiscovery.js +10 -52
  174. package/dist/roap/turnDiscovery.js.map +1 -1
  175. package/dist/statsAnalyzer/global.js +0 -2
  176. package/dist/statsAnalyzer/global.js.map +1 -1
  177. package/dist/statsAnalyzer/index.js +66 -174
  178. package/dist/statsAnalyzer/index.js.map +1 -1
  179. package/dist/statsAnalyzer/mqaUtil.js +54 -53
  180. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  181. package/dist/transcription/index.js +13 -45
  182. package/dist/transcription/index.js.map +1 -1
  183. package/internal-README.md +7 -6
  184. package/package.json +18 -18
  185. package/src/common/browser-detection.ts +9 -6
  186. package/src/common/collection.ts +3 -1
  187. package/src/common/errors/captcha-error.ts +6 -6
  188. package/src/common/errors/intent-to-join.ts +6 -6
  189. package/src/common/errors/join-meeting.ts +12 -8
  190. package/src/common/errors/media.ts +6 -6
  191. package/src/common/errors/parameter.ts +9 -6
  192. package/src/common/errors/password-error.ts +6 -6
  193. package/src/common/errors/permission.ts +5 -5
  194. package/src/common/errors/reconnection.ts +6 -6
  195. package/src/common/errors/stats.ts +6 -6
  196. package/src/common/errors/webex-errors.ts +7 -5
  197. package/src/common/errors/webex-meetings-error.ts +1 -1
  198. package/src/common/events/events-scope.ts +5 -1
  199. package/src/common/events/events.ts +5 -1
  200. package/src/common/events/trigger-proxy.ts +8 -3
  201. package/src/common/events/util.ts +1 -2
  202. package/src/common/logs/logger-proxy.ts +21 -10
  203. package/src/common/logs/request.ts +11 -8
  204. package/src/config.ts +11 -11
  205. package/src/constants.ts +1 -1
  206. package/src/index.js +1 -1
  207. package/src/locus-info/controlsUtils.ts +34 -24
  208. package/src/locus-info/fullState.ts +15 -11
  209. package/src/locus-info/hostUtils.ts +4 -3
  210. package/src/locus-info/index.ts +25 -34
  211. package/src/locus-info/infoUtils.ts +12 -4
  212. package/src/locus-info/mediaSharesUtils.ts +4 -4
  213. package/src/locus-info/parser.ts +45 -68
  214. package/src/locus-info/selfUtils.ts +106 -57
  215. package/src/media/index.ts +123 -135
  216. package/src/media/internal-media-core-wrapper.ts +2 -2
  217. package/src/media/properties.ts +30 -20
  218. package/src/media/util.ts +1 -1
  219. package/src/mediaQualityMetrics/config.ts +46 -46
  220. package/src/meeting/effectsState.ts +35 -35
  221. package/src/meeting/in-meeting-actions.ts +7 -3
  222. package/src/meeting/index.ts +1559 -1292
  223. package/src/meeting/muteState.ts +62 -31
  224. package/src/meeting/request.ts +155 -116
  225. package/src/meeting/request.type.ts +8 -8
  226. package/src/meeting/state.ts +45 -30
  227. package/src/meeting/util.ts +101 -70
  228. package/src/meeting-info/collection.ts +2 -1
  229. package/src/meeting-info/index.ts +32 -30
  230. package/src/meeting-info/meeting-info-v2.ts +106 -108
  231. package/src/meeting-info/request.ts +9 -3
  232. package/src/meeting-info/util.ts +54 -46
  233. package/src/meeting-info/utilv2.ts +59 -53
  234. package/src/meetings/collection.ts +1 -1
  235. package/src/meetings/index.ts +512 -440
  236. package/src/meetings/request.ts +26 -24
  237. package/src/meetings/util.ts +29 -29
  238. package/src/member/index.ts +55 -49
  239. package/src/member/util.ts +26 -13
  240. package/src/members/collection.ts +0 -1
  241. package/src/members/index.ts +182 -126
  242. package/src/members/request.ts +46 -14
  243. package/src/members/util.ts +44 -42
  244. package/src/metrics/config.ts +254 -81
  245. package/src/metrics/constants.ts +0 -2
  246. package/src/metrics/index.ts +84 -71
  247. package/src/multistream/multistreamMedia.ts +1 -0
  248. package/src/multistream/receiveSlot.ts +1 -0
  249. package/src/multistream/receiveSlotManager.ts +1 -0
  250. package/src/multistream/remoteMedia.ts +1 -1
  251. package/src/multistream/remoteMediaGroup.ts +2 -1
  252. package/src/multistream/remoteMediaManager.ts +3 -0
  253. package/src/networkQualityMonitor/index.ts +20 -23
  254. package/src/personal-meeting-room/index.ts +12 -16
  255. package/src/personal-meeting-room/request.ts +10 -3
  256. package/src/personal-meeting-room/util.ts +3 -3
  257. package/src/reachability/index.ts +61 -59
  258. package/src/reachability/request.ts +36 -32
  259. package/src/reactions/reactions.ts +4 -4
  260. package/src/reactions/reactions.type.ts +4 -3
  261. package/src/reconnection-manager/index.ts +139 -84
  262. package/src/roap/index.ts +46 -38
  263. package/src/roap/request.ts +44 -31
  264. package/src/roap/turnDiscovery.ts +59 -30
  265. package/src/statsAnalyzer/global.ts +30 -33
  266. package/src/statsAnalyzer/index.ts +432 -175
  267. package/src/statsAnalyzer/mqaUtil.ts +178 -72
  268. package/src/transcription/index.ts +34 -32
  269. package/test/integration/spec/journey.js +664 -463
  270. package/test/integration/spec/space-meeting.js +319 -204
  271. package/test/integration/spec/transcription.js +7 -8
  272. package/test/unit/spec/common/browser-detection.js +9 -28
  273. package/test/unit/spec/fixture/locus.js +92 -90
  274. package/test/unit/spec/locus-info/controlsUtils.js +5 -5
  275. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  276. package/test/unit/spec/locus-info/index.js +1 -2
  277. package/test/unit/spec/locus-info/infoUtils.js +26 -33
  278. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  279. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  280. package/test/unit/spec/locus-info/parser.js +3 -9
  281. package/test/unit/spec/locus-info/selfConstant.js +72 -103
  282. package/test/unit/spec/locus-info/selfUtils.js +21 -12
  283. package/test/unit/spec/meeting/effectsState.js +36 -46
  284. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -3
  285. package/test/unit/spec/meeting/index.js +1279 -685
  286. package/test/unit/spec/meeting/muteState.js +42 -33
  287. package/test/unit/spec/meeting/request.js +57 -46
  288. package/test/unit/spec/meeting/utils.js +78 -53
  289. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  290. package/test/unit/spec/meeting-info/request.js +7 -9
  291. package/test/unit/spec/meeting-info/util.js +11 -12
  292. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  293. package/test/unit/spec/meetings/collection.js +1 -1
  294. package/test/unit/spec/meetings/index.js +438 -257
  295. package/test/unit/spec/meetings/utils.js +14 -12
  296. package/test/unit/spec/member/index.js +0 -1
  297. package/test/unit/spec/member/util.js +5 -6
  298. package/test/unit/spec/members/index.js +104 -54
  299. package/test/unit/spec/members/request.js +29 -20
  300. package/test/unit/spec/members/utils.js +8 -5
  301. package/test/unit/spec/metrics/index.js +16 -21
  302. package/test/unit/spec/networkQualityMonitor/index.js +21 -15
  303. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  304. package/test/unit/spec/reachability/index.ts +9 -11
  305. package/test/unit/spec/reconnection-manager/index.js +16 -18
  306. package/test/unit/spec/roap/turnDiscovery.ts +22 -19
  307. package/test/unit/spec/stats-analyzer/index.js +25 -20
  308. package/test/utils/cmr.js +44 -42
  309. package/test/utils/testUtils.js +83 -74
  310. package/test/utils/webex-config.js +18 -18
  311. package/test/utils/webex-test-users.js +53 -50
@@ -1 +1 @@
1
- {"version":3,"names":["AllEqualLayout","screenShareVideo","size","activeSpeakerVideoPaneGroups","id","numPanes","priority","SingleLayout","OnePlusFiveLayout","TwoMainPlusSixSmallLayout","RemoteScreenShareWithSmallThumbnailsLayout","Stage2x2With6ThumbnailsLayout","memberVideoPanes","csi","undefined","DefaultConfiguration","audio","numOfActiveSpeakerStreams","video","preferLiveVideo","initialLayoutId","layouts","AllEqual","OnePlusFive","Single","Stage","ScreenShareView","screenShare","Event","RemoteMediaManager","receiveSlotManager","mediaRequestManagers","config","started","media","activeSpeakerGroups","memberPanes","checkConfigValidity","slots","screenShareAudio","unused","activeSpeaker","receiverSelected","receiveSlotAllocations","LoggerProxy","logger","log","Error","forEach","layout","groupIds","paneIds","groupPriorites","group","pane","createAudioMedia","preallocateVideoReceiveSlots","setLayout","invalidateCurrentRemoteMedia","commit","slot","releaseSlot","length","push","releaseUnusedVideoSlots","currentLayout","currentLayoutId","activeSpeakerCount","reduce","sum","paneGroup","receiverSelectedCount","maxNumVideoPanesRequired","maxValue","Math","max","getRequiredNumVideoSlotsForLayout","allocateSlot","MC","MediaType","VideoMain","layoutId","updateVideoReceiveSlots","updateVideoRemoteMediaObjects","emitVideoLayoutChangedEvent","i","AudioMain","RemoteMediaGroup","emit","file","function","AudioCreated","requiredCsis","memberVideoPane","isCsiNeededByCurrentLayout","notNeededReceiverSelectedSlots","paneIndex","freeSlot","pop","memberPane","existingSlot","find","isExistingSlotAlreadyAllocated","includes","requiredNumSlots","totalNumSlots","numSlotsToCreate","trimReceiverSelectedSlots","allocateSlotsToVideoPaneGroups","groupId","paneGroupInCurrentLayout","groupInLayout","mediaGroup","resolution","warn","paneId","paneInCurrentLayout","paneInLayout","remoteMedia","RemoteMedia","sendMediaRequest","options","stop","remoteMediaGroup","VideoLayoutChanged","activeSpeakerVideoPanes","cancelMediaRequest","newPane","receiveSlot","reject","resolve","getUnderlyingReceiveSlot","index","indexOf","splice","pin","unpin","isPinned","EventsScope"],"sources":["remoteMediaManager.ts"],"sourcesContent":["import {cloneDeep, remove} from 'lodash';\nimport {EventMap} from 'typed-emitter';\nimport {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\n\nimport {RemoteMedia, RemoteVideoResolution} from './remoteMedia';\nimport {ReceiveSlot, CSI} from './receiveSlot';\nimport {ReceiveSlotManager} from './receiveSlotManager';\nimport {RemoteMediaGroup} from './remoteMediaGroup';\nimport {MediaRequestManager} from './mediaRequestManager';\n\nexport type PaneSize = RemoteVideoResolution;\nexport type LayoutId = string;\nexport type PaneId = string;\nexport type PaneGroupId = string;\n\nexport interface ActiveSpeakerVideoPaneGroup {\n id: PaneGroupId;\n numPanes: number; // maximum number of panes in the group (actual number may be lower, if there are not enough participants in the meeting)\n size: PaneSize; // preferred size for all panes in the group\n priority: number; // 0-255 (255 = highest priority), each group must have a different priority from all other groups\n}\n\nexport interface MemberVideoPane {\n id: PaneId;\n size: PaneSize;\n csi?: CSI;\n}\n\nexport interface VideoLayout {\n screenShareVideo: {\n size: PaneSize | null; // null if you don't want to receive any screen share video\n };\n activeSpeakerVideoPaneGroups?: ActiveSpeakerVideoPaneGroup[]; // list of active speaker video pane groups\n memberVideoPanes?: MemberVideoPane[]; // list of video panes for specific members, CSI values can be changed later via setVideoPaneCsi()\n}\n\nexport interface Configuration {\n audio: {\n numOfActiveSpeakerStreams: number; // number of audio streams we want to receive\n };\n video: {\n preferLiveVideo: boolean; // applies to all pane groups with active speaker policy\n initialLayoutId: LayoutId;\n\n layouts: {[key: LayoutId]: VideoLayout}; // a map of all available layouts, a layout can be set via setLayout() method\n };\n screenShare: {\n audio: boolean; // whether we ever want to receive screen share audio at all\n video: boolean; // whether we ever want to receive screen share video at all\n };\n}\n\n/* Predefined layouts: */\n\n// An \"all equal\" grid, with size up to 3 x 3 = 9:\nconst AllEqualLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'main',\n numPanes: 9,\n size: 'best',\n priority: 255,\n },\n ],\n};\n\n// A layout with just a single remote active speaker video pane:\nconst SingleLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'main',\n numPanes: 1,\n size: 'best',\n priority: 255,\n },\n ],\n};\n\n// A layout with 1 big pane for the highest priority active speaker and 5 small panes for other active speakers:\nconst OnePlusFiveLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'mainBigOne',\n numPanes: 1,\n size: 'large',\n priority: 255,\n },\n {\n id: 'secondarySetOfSmallPanes',\n numPanes: 5,\n size: 'very small',\n priority: 254,\n },\n ],\n};\n\n// A layout with 2 big panes for 2 main active speakers and a strip of 6 small panes for other active speakers:\nconst TwoMainPlusSixSmallLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'mainGroupWith2BigPanes',\n numPanes: 2,\n size: 'large',\n priority: 255,\n },\n {\n id: 'secondaryGroupOfSmallPanes',\n numPanes: 6,\n size: 'small',\n priority: 254,\n },\n ],\n};\n\n// A strip of 8 small video panes (thumbnails) displayed at the top of a remote screenshare:\nconst RemoteScreenShareWithSmallThumbnailsLayout: VideoLayout = {\n screenShareVideo: {size: 'best'},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'thumbnails',\n numPanes: 8,\n size: 'thumbnail',\n priority: 255,\n },\n ],\n};\n\n// A staged layout with 4 pre-selected meeting participants in the main 2x2 grid and 6 small panes for other active speakers at the top:\nconst Stage2x2With6ThumbnailsLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'thumbnails',\n numPanes: 6,\n size: 'thumbnail',\n priority: 255,\n },\n ],\n memberVideoPanes: [\n {id: 'stage-1', size: 'medium', csi: undefined},\n {id: 'stage-2', size: 'medium', csi: undefined},\n {id: 'stage-3', size: 'medium', csi: undefined},\n {id: 'stage-4', size: 'medium', csi: undefined},\n ],\n};\n\n/**\n * Default configuration:\n * - uses 3 audio streams\n * - prefers active speakers with live video (e.g. are not audio only or video muted) over active speakers without live video\n * - has a few layouts defined, including 1 that contains remote screen share (ScreenShareView)\n */\nexport const DefaultConfiguration: Configuration = {\n audio: {\n numOfActiveSpeakerStreams: 3,\n },\n video: {\n preferLiveVideo: true,\n initialLayoutId: 'AllEqual',\n\n layouts: {\n AllEqual: AllEqualLayout,\n OnePlusFive: OnePlusFiveLayout,\n Single: SingleLayout,\n Stage: Stage2x2With6ThumbnailsLayout,\n ScreenShareView: RemoteScreenShareWithSmallThumbnailsLayout,\n },\n },\n screenShare: {\n audio: true,\n video: true,\n },\n};\n\nexport enum Event {\n // events for audio streams\n AudioCreated = 'AudioCreated',\n ScreenShareAudioCreated = 'ScreenShareCreated',\n\n // events for video streams\n VideoLayoutChanged = 'VideoLayoutChanged',\n}\n\nexport interface VideoLayoutChangedEventData {\n layoutId: LayoutId;\n activeSpeakerVideoPanes: {\n [key: PaneGroupId]: RemoteMediaGroup;\n };\n memberVideoPanes: {[key: PaneId]: RemoteMedia};\n screenShareVideo?: RemoteMedia;\n}\nexport interface Events extends EventMap {\n // audio\n [Event.AudioCreated]: (audio: RemoteMediaGroup) => void;\n [Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMedia) => void;\n\n // video\n [Event.VideoLayoutChanged]: (data: VideoLayoutChangedEventData) => void;\n}\n\n/**\n * A helper class that manages all remote audio/video streams in order to achieve a predefined set of layouts.\n * It also creates a fixed number of audio streams and these don't change during the meeting.\n *\n * Things that RemoteMediaManager does:\n * - owns the receive slots (creates them when needed, and re-uses them when switching layouts)\n * - constructs appropriate RemoteMedia and RemoteMediaGroup objects and sends appropriate mediaRequests\n */\nexport class RemoteMediaManager extends EventsScope {\n private config: Configuration;\n\n private started: boolean;\n\n private receiveSlotManager: ReceiveSlotManager;\n\n private mediaRequestManagers: {\n audio: MediaRequestManager;\n video: MediaRequestManager;\n };\n\n private currentLayout?: VideoLayout;\n\n private slots: {\n audio: ReceiveSlot[];\n screenShareAudio?: ReceiveSlot;\n screenShareVideo?: ReceiveSlot;\n video: {\n unused: ReceiveSlot[];\n activeSpeaker: ReceiveSlot[];\n receiverSelected: ReceiveSlot[];\n };\n };\n\n private media: {\n audio?: RemoteMediaGroup;\n video: {\n activeSpeakerGroups: {\n [key: PaneGroupId]: RemoteMediaGroup;\n };\n memberPanes: {[key: PaneId]: RemoteMedia};\n };\n };\n\n private receiveSlotAllocations: {\n activeSpeaker: {[key: PaneGroupId]: {slots: ReceiveSlot[]}};\n receiverSelected: {[key: PaneId]: ReceiveSlot};\n };\n\n private currentLayoutId?: LayoutId;\n\n /**\n * Constructor\n *\n * @param {ReceiveSlotManager} receiveSlotManager\n * @param {{audio: MediaRequestManager, video: mediaRequestManagers}} mediaRequestManagers\n * @param {Configuration} config Configuration describing what video layouts to use during the meeting\n */\n constructor(\n receiveSlotManager: ReceiveSlotManager,\n mediaRequestManagers: {\n audio: MediaRequestManager;\n video: MediaRequestManager;\n },\n config: Configuration = DefaultConfiguration\n ) {\n super();\n this.started = false;\n this.config = config;\n this.receiveSlotManager = receiveSlotManager;\n this.mediaRequestManagers = mediaRequestManagers;\n this.media = {\n audio: undefined,\n video: {\n activeSpeakerGroups: {},\n memberPanes: {},\n },\n };\n\n this.checkConfigValidity();\n\n this.slots = {\n audio: [],\n screenShareAudio: undefined,\n screenShareVideo: undefined,\n video: {\n unused: [],\n activeSpeaker: [],\n receiverSelected: [],\n },\n };\n\n this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};\n\n LoggerProxy.logger.log(\n `RemoteMediaManager#constructor --> RemoteMediaManager created with config: ${JSON.stringify(\n this.config\n )}`\n );\n }\n\n /**\n * Checks if configuration is valid, throws an error if it's not\n */\n private checkConfigValidity() {\n if (!(this.config.video.initialLayoutId in this.config.video.layouts)) {\n throw new Error(\n `invalid config: initialLayoutId \"${this.config.video.initialLayoutId}\" doesn't match any of the layouts`\n );\n }\n\n // check if each layout is valid\n Object.values(this.config.video.layouts).forEach((layout) => {\n const groupIds = {};\n const paneIds = {};\n const groupPriorites = {};\n\n layout.activeSpeakerVideoPaneGroups?.forEach((group) => {\n if (groupIds[group.id]) {\n throw new Error(\n `invalid config: duplicate active speaker video pane group id: ${group.id}`\n );\n }\n groupIds[group.id] = true;\n\n if (groupPriorites[group.priority]) {\n throw new Error(\n `invalid config: multiple active speaker video pane groups have same priority: ${group.priority}`\n );\n }\n groupPriorites[group.priority] = true;\n });\n\n layout.memberVideoPanes?.forEach((pane) => {\n if (paneIds[pane.id]) {\n throw new Error(`invalid config: duplicate member video pane id: ${pane.id}`);\n }\n paneIds[pane.id] = true;\n });\n });\n }\n\n /**\n * Starts the RemoteMediaManager.\n *\n * @returns {Promise}\n */\n public async start() {\n if (this.started) {\n throw new Error('start() failure: already started');\n }\n this.started = true;\n\n await this.createAudioMedia();\n\n // todo: create screen share audio remote media (SPARK-377812)\n // todo: create screen share video receive slot (SPARK-377812)\n\n await this.preallocateVideoReceiveSlots();\n\n await this.setLayout(this.config.video.initialLayoutId);\n }\n\n /**\n * Releases all the used resources (like allocated receive slots). This function needs\n * to be called when we leave the meeting, etc.\n */\n public stop() {\n // invalidate all remoteMedia objects\n this.invalidateCurrentRemoteMedia({audio: true, video: true, commit: true});\n\n // release all audio receive slots\n this.slots.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));\n this.slots.audio.length = 0;\n\n // todo: screenshare slots... (SPARK-377812)\n\n this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};\n\n this.slots.video.unused.push(...this.slots.video.activeSpeaker);\n this.slots.video.activeSpeaker.length = 0;\n\n this.slots.video.unused.push(...this.slots.video.receiverSelected);\n this.slots.video.receiverSelected.length = 0;\n\n this.releaseUnusedVideoSlots();\n\n this.currentLayout = undefined;\n this.currentLayoutId = undefined;\n this.started = false;\n }\n\n /**\n * Returns the total number of main video panes required for a given layout\n *\n * @param {VideoLayout} layout\n * @returns {number}\n */\n private getRequiredNumVideoSlotsForLayout(layout?: VideoLayout) {\n if (!layout) {\n return 0;\n }\n\n const activeSpeakerCount =\n layout.activeSpeakerVideoPaneGroups?.reduce(\n (sum, paneGroup) => sum + paneGroup.numPanes,\n 0\n ) || 0;\n\n const receiverSelectedCount = layout.memberVideoPanes?.length || 0;\n\n return activeSpeakerCount + receiverSelectedCount;\n }\n\n /**\n * Allocates the maximum number of panes that any of the configured layouts will require.\n * We do this at the beginning, because it's more efficient (much faster) then allocating receive slots\n * later, after the SDP exchange was done.\n */\n private async preallocateVideoReceiveSlots() {\n const maxNumVideoPanesRequired = Object.values(this.config.video.layouts).reduce(\n (maxValue, layout) => Math.max(maxValue, this.getRequiredNumVideoSlotsForLayout(layout)),\n 0\n );\n\n while (this.slots.video.unused.length < maxNumVideoPanesRequired) {\n // eslint-disable-next-line no-await-in-loop\n this.slots.video.unused.push(\n await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)\n );\n }\n }\n\n /**\n * Changes the layout (triggers Event.VideoLayoutChanged)\n *\n * @param {LayoutId} layoutId new layout id\n * @returns {Promise}\n */\n public async setLayout(layoutId: LayoutId) {\n if (!(layoutId in this.config.video.layouts)) {\n throw new Error(\n `invalid layoutId: \"${layoutId}\" doesn't match any of the configured layouts`\n );\n }\n if (!this.started) {\n throw new Error('setLayout() called before start()');\n }\n this.currentLayoutId = layoutId;\n this.currentLayout = cloneDeep(this.config.video.layouts[this.currentLayoutId]);\n\n await this.updateVideoReceiveSlots();\n this.updateVideoRemoteMediaObjects();\n this.emitVideoLayoutChangedEvent();\n }\n\n /**\n * Returns the currently selected layout id\n *\n * @returns {LayoutId}\n */\n public getLayoutId(): LayoutId | undefined {\n return this.currentLayoutId;\n }\n\n /**\n * Creates the audio slots\n */\n private async createAudioMedia() {\n // create the audio receive slots\n for (let i = 0; i < this.config.audio.numOfActiveSpeakerStreams; i += 1) {\n // eslint-disable-next-line no-await-in-loop\n const slot = await this.receiveSlotManager.allocateSlot(MC.MediaType.AudioMain);\n\n this.slots.audio.push(slot);\n }\n\n // create a remote media group\n this.media.audio = new RemoteMediaGroup(\n this.mediaRequestManagers.audio,\n this.slots.audio,\n 255,\n true\n );\n\n this.emit(\n {file: 'multistream/remoteMediaManager', function: 'createAudioMedia'},\n Event.AudioCreated,\n this.media.audio\n );\n }\n\n /**\n * Goes over all receiver-selected slots and keeps only the ones that are required by a given layout,\n * the rest are all moved to the \"unused\" list\n */\n private trimReceiverSelectedSlots() {\n const requiredCsis = {};\n\n // fill requiredCsis with all the CSIs that the given layout requires\n this.currentLayout?.memberVideoPanes?.forEach((memberVideoPane) => {\n if (memberVideoPane.csi !== undefined) {\n requiredCsis[memberVideoPane.csi] = true;\n }\n });\n\n const isCsiNeededByCurrentLayout = (csi?: CSI): boolean => {\n if (csi === undefined) {\n return false;\n }\n\n return !!requiredCsis[csi];\n };\n\n // keep receiverSelected slots that match our new requiredCsis, move the rest of receiverSelected slots to unused\n const notNeededReceiverSelectedSlots = remove(\n this.slots.video.receiverSelected,\n (slot) => isCsiNeededByCurrentLayout(slot.csi) === false\n );\n\n this.slots.video.unused.push(...notNeededReceiverSelectedSlots);\n }\n\n /**\n * Releases all the \"unused\" video slots.\n */\n private releaseUnusedVideoSlots() {\n this.slots.video.unused.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));\n this.slots.video.unused.length = 0;\n }\n\n /**\n * Allocates receive slots to all video panes in the current selected layout\n */\n private allocateSlotsToVideoPaneGroups() {\n this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};\n\n this.currentLayout?.activeSpeakerVideoPaneGroups?.forEach((group) => {\n this.receiveSlotAllocations.activeSpeaker[group.id] = {slots: []};\n\n for (let paneIndex = 0; paneIndex < group.numPanes; paneIndex += 1) {\n // allocate a slot from the \"unused\" list\n const freeSlot = this.slots.video.unused.pop();\n\n if (freeSlot) {\n this.slots.video.activeSpeaker.push(freeSlot);\n this.receiveSlotAllocations.activeSpeaker[group.id].slots.push(freeSlot);\n }\n }\n });\n\n this.currentLayout?.memberVideoPanes?.forEach((memberPane) => {\n // check if there is existing slot for this csi\n const existingSlot = this.slots.video.receiverSelected.find(\n (slot) => slot.csi === memberPane.csi\n );\n\n const isExistingSlotAlreadyAllocated = Object.values(\n this.receiveSlotAllocations.receiverSelected\n ).includes(existingSlot);\n\n if (memberPane.csi !== undefined && existingSlot && !isExistingSlotAlreadyAllocated) {\n // found it, so use it\n this.receiveSlotAllocations.receiverSelected[memberPane.id] = existingSlot;\n } else {\n // allocate a slot from the \"unused\" list\n const freeSlot = this.slots.video.unused.pop();\n\n if (freeSlot) {\n this.slots.video.receiverSelected.push(freeSlot);\n this.receiveSlotAllocations.receiverSelected[memberPane.id] = freeSlot;\n }\n }\n });\n }\n\n /**\n * Makes sure we have the right number of receive slots created for the current layout\n * and allocates them to the right video panes / pane groups\n *\n * @returns {Promise}\n */\n private async updateVideoReceiveSlots() {\n const requiredNumSlots = this.getRequiredNumVideoSlotsForLayout(this.currentLayout);\n const totalNumSlots =\n this.slots.video.unused.length +\n this.slots.video.activeSpeaker.length +\n this.slots.video.receiverSelected.length;\n\n // ensure we have enough total slots for current layout\n if (totalNumSlots < requiredNumSlots) {\n let numSlotsToCreate = requiredNumSlots - totalNumSlots;\n\n while (numSlotsToCreate > 0) {\n // eslint-disable-next-line no-await-in-loop\n this.slots.video.unused.push(\n await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)\n );\n numSlotsToCreate -= 1;\n }\n }\n\n // move all no longer needed receiver-selected slots to \"unused\"\n this.trimReceiverSelectedSlots();\n\n // move all active speaker slots to \"unused\"\n this.slots.video.unused.push(...this.slots.video.activeSpeaker);\n this.slots.video.activeSpeaker.length = 0;\n\n // allocate the slots to the right panes / pane groups\n this.allocateSlotsToVideoPaneGroups();\n\n LoggerProxy.logger.log(\n `RemoteMediaManager#updateVideoReceiveSlots --> receive slots updated: unused=${this.slots.video.unused.length}, activeSpeaker=${this.slots.video.activeSpeaker.length}, receiverSelected=${this.slots.video.receiverSelected.length}`\n );\n\n // If this is the initial layout, there may be some \"unused\" slots left because of the preallocation\n // done in this.preallocateVideoReceiveSlots(), so release them now\n this.releaseUnusedVideoSlots();\n }\n\n /**\n * Creates new RemoteMedia and RemoteMediaGroup objects for the current layout\n * and sends the media requests for all of them.\n */\n private updateVideoRemoteMediaObjects() {\n // invalidate all the previous remote media objects and cancel their media requests\n this.invalidateCurrentRemoteMedia({audio: false, video: true, commit: false});\n\n // create new remoteMediaGroup objects\n this.media.video.activeSpeakerGroups = {};\n this.media.video.memberPanes = {};\n\n for (const [groupId, group] of Object.entries(this.receiveSlotAllocations.activeSpeaker)) {\n const paneGroupInCurrentLayout = this.currentLayout?.activeSpeakerVideoPaneGroups?.find(\n (groupInLayout) => groupInLayout.id === groupId\n );\n\n if (paneGroupInCurrentLayout) {\n const mediaGroup = new RemoteMediaGroup(\n this.mediaRequestManagers.video,\n group.slots,\n paneGroupInCurrentLayout.priority,\n false,\n {\n preferLiveVideo: this.config.video.preferLiveVideo,\n resolution: paneGroupInCurrentLayout.size,\n }\n );\n\n this.media.video.activeSpeakerGroups[groupId] = mediaGroup;\n } else {\n // this should never happen, because this.receiveSlotAllocations are created based on current layout configuration\n LoggerProxy.logger.warn(\n `a group id ${groupId} from this.receiveSlotAllocations.activeSpeaker cannot be found in the current layout configuration`\n );\n }\n }\n\n // create new remoteMedia objects\n for (const [paneId, slot] of Object.entries(this.receiveSlotAllocations.receiverSelected)) {\n const paneInCurrentLayout = this.currentLayout?.memberVideoPanes?.find(\n (paneInLayout) => paneInLayout.id === paneId\n );\n\n if (paneInCurrentLayout) {\n const remoteMedia = new RemoteMedia(slot, this.mediaRequestManagers.video, {\n resolution: paneInCurrentLayout.size,\n });\n\n if (paneInCurrentLayout.csi) {\n remoteMedia.sendMediaRequest(paneInCurrentLayout.csi, false);\n }\n\n this.media.video.memberPanes[paneId] = remoteMedia;\n } else {\n // this should never happen, because this.receiveSlotAllocations are created based on current layout configuration\n LoggerProxy.logger.warn(\n `a pane id ${paneId} from this.receiveSlotAllocations.receiverSelected cannot be found in the current layout configuration`\n );\n }\n }\n // todo: screenshare (SPARK-377812)\n\n this.mediaRequestManagers.video.commit();\n }\n\n /**\n * Invalidates all remote media objects belonging to currently selected layout\n */\n private invalidateCurrentRemoteMedia(options: {audio: boolean; video: boolean; commit: boolean}) {\n const {audio, video, commit} = options;\n\n if (audio && this.media.audio) {\n this.media.audio.stop(commit);\n }\n if (video) {\n Object.values(this.media.video.activeSpeakerGroups).forEach((remoteMediaGroup) => {\n remoteMediaGroup.stop(false);\n });\n Object.values(this.media.video.memberPanes).forEach((remoteMedia) => {\n remoteMedia.stop(false);\n });\n if (commit) {\n this.mediaRequestManagers.video.commit();\n }\n }\n }\n\n /** emits Event.VideoLayoutChanged */\n private emitVideoLayoutChangedEvent() {\n // todo: at this point the receive slots might still be showing a participant from previous layout, we should\n // wait for our media requests to be fullfilled, but there is no API for that right now (we could wait for source updates\n // but in some cases they might never come, or would need to always make sure to use a new set of receiver slots)\n // for now it's fine to have it like this, we will re-evaluate if it needs improving after more testing\n\n this.emit(\n {\n file: 'multistream/remoteMediaManager',\n function: 'emitVideoLayoutChangedEvent',\n },\n Event.VideoLayoutChanged,\n {\n layoutId: this.currentLayoutId,\n activeSpeakerVideoPanes: this.media.video.activeSpeakerGroups,\n memberVideoPanes: this.media.video.memberPanes,\n screenShareVideo: undefined, // todo: screen share (SPARK-377812)\n }\n );\n }\n\n /**\n * Sets a new CSI on a given remote media object\n *\n * @param {RemoteMedia} remoteMedia remote Media object to modify\n * @param {CSI} csi new CSI value, can be null if we want to stop receiving media\n */\n public setRemoteVideoCsi(remoteMedia: RemoteMedia, csi: CSI | null) {\n if (!Object.values(this.media.video.memberPanes).includes(remoteMedia)) {\n throw new Error('remoteMedia not found');\n }\n\n if (csi) {\n remoteMedia.sendMediaRequest(csi, true);\n } else {\n remoteMedia.cancelMediaRequest(true);\n }\n }\n\n /**\n * Adds a new member video pane to the currently selected layout.\n *\n * Changes to the layout are lost after a layout change.\n *\n * @param {MemberVideoPane} newPane\n * @returns {Promise<RemoteMedia>}\n */\n public async addMemberVideoPane(newPane: MemberVideoPane): Promise<RemoteMedia> {\n if (!this.currentLayout) {\n throw new Error('There is no current layout selected, call start() first');\n }\n\n if (!this.currentLayout?.memberVideoPanes) {\n this.currentLayout.memberVideoPanes = [];\n }\n\n if (newPane.id in this.currentLayout.memberVideoPanes) {\n throw new Error(\n `duplicate pane id ${newPane.id} - this pane already exists in current layout's memberVideoPanes`\n );\n }\n\n this.currentLayout.memberVideoPanes.push(newPane);\n\n const receiveSlot = await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain);\n\n this.slots.video.receiverSelected.push(receiveSlot);\n\n const remoteMedia = new RemoteMedia(receiveSlot, this.mediaRequestManagers.video, {\n resolution: newPane.size,\n });\n\n if (newPane.csi) {\n remoteMedia.sendMediaRequest(newPane.csi, true);\n }\n\n this.media.video.memberPanes[newPane.id] = remoteMedia;\n\n return remoteMedia;\n }\n\n /**\n * Removes a member video pane from the currently selected layout.\n *\n * Changes to the layout are lost after a layout change.\n *\n * @param {PaneId} paneId pane id of the pane to remove\n * @returns {Promise<void>}\n */\n public removeMemberVideoPane(paneId: PaneId): Promise<void> {\n if (!this.currentLayout) {\n return Promise.reject(new Error('There is no current layout selected, call start() first'));\n }\n\n if (!this.currentLayout.memberVideoPanes?.find((pane) => pane.id === paneId)) {\n // pane id doesn't exist, so nothing to do\n LoggerProxy.logger.log(\n `RemoteMediaManager#removeMemberVideoPane --> removeMemberVideoPane() called for a non-existent paneId: ${paneId} (pane not found in currentLayout.memberVideoPanes)`\n );\n\n return Promise.resolve();\n }\n\n if (!this.media.video.memberPanes[paneId]) {\n // pane id doesn't exist, so nothing to do\n LoggerProxy.logger.log(\n `RemoteMediaManager#removeMemberVideoPane --> removeMemberVideoPane() called for a non-existent paneId: ${paneId} (pane not found in this.media.video.memberPanes)`\n );\n\n return Promise.resolve();\n }\n\n const remoteMedia = this.media.video.memberPanes[paneId];\n\n const receiveSlot = remoteMedia.getUnderlyingReceiveSlot();\n\n if (receiveSlot) {\n this.receiveSlotManager.releaseSlot(receiveSlot);\n\n const index = this.slots.video.receiverSelected.indexOf(receiveSlot);\n\n if (index >= 0) {\n this.slots.video.receiverSelected.splice(index, 1);\n }\n }\n remoteMedia.stop();\n\n delete this.media.video.memberPanes[paneId];\n delete this.currentLayout.memberVideoPanes?.[paneId];\n\n return Promise.resolve();\n }\n\n /**\n * Pins an active speaker remote media object to the given CSI value. From that moment\n * onwards the remote media will only play audio/video from that specific CSI until\n * unpinActiveSpeakerVideoPane() is called or current layout is changed.\n *\n * @param {RemoteMedia} remoteMedia remote media object reference\n * @param {CSI} csi CSI value to pin to, if undefined, then current CSI value is used\n */\n public pinActiveSpeakerVideoPane(remoteMedia: RemoteMedia, csi?: CSI): void {\n const remoteMediaGroup = Object.values(this.media.video.activeSpeakerGroups).find((group) =>\n group.includes(remoteMedia, 'unpinned')\n );\n\n if (!remoteMediaGroup) {\n throw new Error(\n 'remoteMedia not found among the unpinned remote media from any active speaker group'\n );\n }\n\n remoteMediaGroup.pin(remoteMedia, csi);\n }\n\n /**\n * Unpins a remote media object from the fixed CSI value it was pinned to.\n *\n * @param {RemoteMedia} remoteMedia remote media object reference\n */\n public unpinActiveSpeakerVideoPane(remoteMedia: RemoteMedia) {\n const remoteMediaGroup = Object.values(this.media.video.activeSpeakerGroups).find((group) =>\n group.includes(remoteMedia, 'pinned')\n );\n\n if (!remoteMediaGroup) {\n throw new Error(\n 'remoteMedia not found among the pinned remote media from any active speaker group'\n );\n }\n\n remoteMediaGroup.unpin(remoteMedia);\n }\n\n /**\n * Returns true if a given remote media object belongs to an active speaker group and has been pinned.\n * Throws an error if the remote media object doesn't belong to any active speaker remote media group.\n *\n * @param {RemoteMedia} remoteMedia remote media object\n * @returns {boolean}\n */\n public isPinned(remoteMedia: RemoteMedia) {\n const remoteMediaGroup = Object.values(this.media.video.activeSpeakerGroups).find((group) =>\n group.includes(remoteMedia)\n );\n\n if (!remoteMediaGroup) {\n throw new Error(\n 'remoteMedia not found among any remote media (pinned or unpinned) from any active speaker group'\n );\n }\n\n return remoteMediaGroup.isPinned(remoteMedia);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["AllEqualLayout","screenShareVideo","size","activeSpeakerVideoPaneGroups","id","numPanes","priority","SingleLayout","OnePlusFiveLayout","TwoMainPlusSixSmallLayout","RemoteScreenShareWithSmallThumbnailsLayout","Stage2x2With6ThumbnailsLayout","memberVideoPanes","csi","undefined","DefaultConfiguration","audio","numOfActiveSpeakerStreams","video","preferLiveVideo","initialLayoutId","layouts","AllEqual","OnePlusFive","Single","Stage","ScreenShareView","screenShare","Event","RemoteMediaManager","receiveSlotManager","mediaRequestManagers","config","started","media","activeSpeakerGroups","memberPanes","checkConfigValidity","slots","screenShareAudio","unused","activeSpeaker","receiverSelected","receiveSlotAllocations","LoggerProxy","logger","log","Error","forEach","layout","groupIds","paneIds","groupPriorites","group","pane","createAudioMedia","preallocateVideoReceiveSlots","setLayout","invalidateCurrentRemoteMedia","commit","slot","releaseSlot","length","push","releaseUnusedVideoSlots","currentLayout","currentLayoutId","activeSpeakerCount","reduce","sum","paneGroup","receiverSelectedCount","maxNumVideoPanesRequired","maxValue","Math","max","getRequiredNumVideoSlotsForLayout","allocateSlot","MC","MediaType","VideoMain","layoutId","updateVideoReceiveSlots","updateVideoRemoteMediaObjects","emitVideoLayoutChangedEvent","i","AudioMain","RemoteMediaGroup","emit","file","function","AudioCreated","requiredCsis","memberVideoPane","isCsiNeededByCurrentLayout","notNeededReceiverSelectedSlots","paneIndex","freeSlot","pop","memberPane","existingSlot","find","isExistingSlotAlreadyAllocated","includes","requiredNumSlots","totalNumSlots","numSlotsToCreate","trimReceiverSelectedSlots","allocateSlotsToVideoPaneGroups","groupId","paneGroupInCurrentLayout","groupInLayout","mediaGroup","resolution","warn","paneId","paneInCurrentLayout","paneInLayout","remoteMedia","RemoteMedia","sendMediaRequest","options","stop","remoteMediaGroup","VideoLayoutChanged","activeSpeakerVideoPanes","cancelMediaRequest","newPane","receiveSlot","reject","resolve","getUnderlyingReceiveSlot","index","indexOf","splice","pin","unpin","isPinned","EventsScope"],"sources":["remoteMediaManager.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport {cloneDeep, remove} from 'lodash';\nimport {EventMap} from 'typed-emitter';\nimport {MediaConnection as MC} from '@webex/internal-media-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\n\nimport {RemoteMedia, RemoteVideoResolution} from './remoteMedia';\nimport {ReceiveSlot, CSI} from './receiveSlot';\nimport {ReceiveSlotManager} from './receiveSlotManager';\nimport {RemoteMediaGroup} from './remoteMediaGroup';\nimport {MediaRequestManager} from './mediaRequestManager';\n\nexport type PaneSize = RemoteVideoResolution;\nexport type LayoutId = string;\nexport type PaneId = string;\nexport type PaneGroupId = string;\n\nexport interface ActiveSpeakerVideoPaneGroup {\n id: PaneGroupId;\n numPanes: number; // maximum number of panes in the group (actual number may be lower, if there are not enough participants in the meeting)\n size: PaneSize; // preferred size for all panes in the group\n priority: number; // 0-255 (255 = highest priority), each group must have a different priority from all other groups\n}\n\nexport interface MemberVideoPane {\n id: PaneId;\n size: PaneSize;\n csi?: CSI;\n}\n\nexport interface VideoLayout {\n screenShareVideo: {\n size: PaneSize | null; // null if you don't want to receive any screen share video\n };\n activeSpeakerVideoPaneGroups?: ActiveSpeakerVideoPaneGroup[]; // list of active speaker video pane groups\n memberVideoPanes?: MemberVideoPane[]; // list of video panes for specific members, CSI values can be changed later via setVideoPaneCsi()\n}\n\nexport interface Configuration {\n audio: {\n numOfActiveSpeakerStreams: number; // number of audio streams we want to receive\n };\n video: {\n preferLiveVideo: boolean; // applies to all pane groups with active speaker policy\n initialLayoutId: LayoutId;\n\n layouts: {[key: LayoutId]: VideoLayout}; // a map of all available layouts, a layout can be set via setLayout() method\n };\n screenShare: {\n audio: boolean; // whether we ever want to receive screen share audio at all\n video: boolean; // whether we ever want to receive screen share video at all\n };\n}\n\n/* Predefined layouts: */\n\n// An \"all equal\" grid, with size up to 3 x 3 = 9:\nconst AllEqualLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'main',\n numPanes: 9,\n size: 'best',\n priority: 255,\n },\n ],\n};\n\n// A layout with just a single remote active speaker video pane:\nconst SingleLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'main',\n numPanes: 1,\n size: 'best',\n priority: 255,\n },\n ],\n};\n\n// A layout with 1 big pane for the highest priority active speaker and 5 small panes for other active speakers:\nconst OnePlusFiveLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'mainBigOne',\n numPanes: 1,\n size: 'large',\n priority: 255,\n },\n {\n id: 'secondarySetOfSmallPanes',\n numPanes: 5,\n size: 'very small',\n priority: 254,\n },\n ],\n};\n\n// A layout with 2 big panes for 2 main active speakers and a strip of 6 small panes for other active speakers:\nconst TwoMainPlusSixSmallLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'mainGroupWith2BigPanes',\n numPanes: 2,\n size: 'large',\n priority: 255,\n },\n {\n id: 'secondaryGroupOfSmallPanes',\n numPanes: 6,\n size: 'small',\n priority: 254,\n },\n ],\n};\n\n// A strip of 8 small video panes (thumbnails) displayed at the top of a remote screenshare:\nconst RemoteScreenShareWithSmallThumbnailsLayout: VideoLayout = {\n screenShareVideo: {size: 'best'},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'thumbnails',\n numPanes: 8,\n size: 'thumbnail',\n priority: 255,\n },\n ],\n};\n\n// A staged layout with 4 pre-selected meeting participants in the main 2x2 grid and 6 small panes for other active speakers at the top:\nconst Stage2x2With6ThumbnailsLayout: VideoLayout = {\n screenShareVideo: {size: null},\n activeSpeakerVideoPaneGroups: [\n {\n id: 'thumbnails',\n numPanes: 6,\n size: 'thumbnail',\n priority: 255,\n },\n ],\n memberVideoPanes: [\n {id: 'stage-1', size: 'medium', csi: undefined},\n {id: 'stage-2', size: 'medium', csi: undefined},\n {id: 'stage-3', size: 'medium', csi: undefined},\n {id: 'stage-4', size: 'medium', csi: undefined},\n ],\n};\n\n/**\n * Default configuration:\n * - uses 3 audio streams\n * - prefers active speakers with live video (e.g. are not audio only or video muted) over active speakers without live video\n * - has a few layouts defined, including 1 that contains remote screen share (ScreenShareView)\n */\nexport const DefaultConfiguration: Configuration = {\n audio: {\n numOfActiveSpeakerStreams: 3,\n },\n video: {\n preferLiveVideo: true,\n initialLayoutId: 'AllEqual',\n\n layouts: {\n AllEqual: AllEqualLayout,\n OnePlusFive: OnePlusFiveLayout,\n Single: SingleLayout,\n Stage: Stage2x2With6ThumbnailsLayout,\n ScreenShareView: RemoteScreenShareWithSmallThumbnailsLayout,\n },\n },\n screenShare: {\n audio: true,\n video: true,\n },\n};\n\nexport enum Event {\n // events for audio streams\n AudioCreated = 'AudioCreated',\n ScreenShareAudioCreated = 'ScreenShareCreated',\n\n // events for video streams\n VideoLayoutChanged = 'VideoLayoutChanged',\n}\n\nexport interface VideoLayoutChangedEventData {\n layoutId: LayoutId;\n activeSpeakerVideoPanes: {\n [key: PaneGroupId]: RemoteMediaGroup;\n };\n memberVideoPanes: {[key: PaneId]: RemoteMedia};\n screenShareVideo?: RemoteMedia;\n}\nexport interface Events extends EventMap {\n // audio\n [Event.AudioCreated]: (audio: RemoteMediaGroup) => void;\n [Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMedia) => void;\n\n // video\n [Event.VideoLayoutChanged]: (data: VideoLayoutChangedEventData) => void;\n}\n\n/**\n * A helper class that manages all remote audio/video streams in order to achieve a predefined set of layouts.\n * It also creates a fixed number of audio streams and these don't change during the meeting.\n *\n * Things that RemoteMediaManager does:\n * - owns the receive slots (creates them when needed, and re-uses them when switching layouts)\n * - constructs appropriate RemoteMedia and RemoteMediaGroup objects and sends appropriate mediaRequests\n */\nexport class RemoteMediaManager extends EventsScope {\n private config: Configuration;\n\n private started: boolean;\n\n private receiveSlotManager: ReceiveSlotManager;\n\n private mediaRequestManagers: {\n audio: MediaRequestManager;\n video: MediaRequestManager;\n };\n\n private currentLayout?: VideoLayout;\n\n private slots: {\n audio: ReceiveSlot[];\n screenShareAudio?: ReceiveSlot;\n screenShareVideo?: ReceiveSlot;\n video: {\n unused: ReceiveSlot[];\n activeSpeaker: ReceiveSlot[];\n receiverSelected: ReceiveSlot[];\n };\n };\n\n private media: {\n audio?: RemoteMediaGroup;\n video: {\n activeSpeakerGroups: {\n [key: PaneGroupId]: RemoteMediaGroup;\n };\n memberPanes: {[key: PaneId]: RemoteMedia};\n };\n };\n\n private receiveSlotAllocations: {\n activeSpeaker: {[key: PaneGroupId]: {slots: ReceiveSlot[]}};\n receiverSelected: {[key: PaneId]: ReceiveSlot};\n };\n\n private currentLayoutId?: LayoutId;\n\n /**\n * Constructor\n *\n * @param {ReceiveSlotManager} receiveSlotManager\n * @param {{audio: MediaRequestManager, video: mediaRequestManagers}} mediaRequestManagers\n * @param {Configuration} config Configuration describing what video layouts to use during the meeting\n */\n constructor(\n receiveSlotManager: ReceiveSlotManager,\n mediaRequestManagers: {\n audio: MediaRequestManager;\n video: MediaRequestManager;\n },\n config: Configuration = DefaultConfiguration\n ) {\n super();\n this.started = false;\n this.config = config;\n this.receiveSlotManager = receiveSlotManager;\n this.mediaRequestManagers = mediaRequestManagers;\n this.media = {\n audio: undefined,\n video: {\n activeSpeakerGroups: {},\n memberPanes: {},\n },\n };\n\n this.checkConfigValidity();\n\n this.slots = {\n audio: [],\n screenShareAudio: undefined,\n screenShareVideo: undefined,\n video: {\n unused: [],\n activeSpeaker: [],\n receiverSelected: [],\n },\n };\n\n this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};\n\n LoggerProxy.logger.log(\n `RemoteMediaManager#constructor --> RemoteMediaManager created with config: ${JSON.stringify(\n this.config\n )}`\n );\n }\n\n /**\n * Checks if configuration is valid, throws an error if it's not\n */\n private checkConfigValidity() {\n if (!(this.config.video.initialLayoutId in this.config.video.layouts)) {\n throw new Error(\n `invalid config: initialLayoutId \"${this.config.video.initialLayoutId}\" doesn't match any of the layouts`\n );\n }\n\n // check if each layout is valid\n Object.values(this.config.video.layouts).forEach((layout) => {\n const groupIds = {};\n const paneIds = {};\n const groupPriorites = {};\n\n layout.activeSpeakerVideoPaneGroups?.forEach((group) => {\n if (groupIds[group.id]) {\n throw new Error(\n `invalid config: duplicate active speaker video pane group id: ${group.id}`\n );\n }\n groupIds[group.id] = true;\n\n if (groupPriorites[group.priority]) {\n throw new Error(\n `invalid config: multiple active speaker video pane groups have same priority: ${group.priority}`\n );\n }\n groupPriorites[group.priority] = true;\n });\n\n layout.memberVideoPanes?.forEach((pane) => {\n if (paneIds[pane.id]) {\n throw new Error(`invalid config: duplicate member video pane id: ${pane.id}`);\n }\n paneIds[pane.id] = true;\n });\n });\n }\n\n /**\n * Starts the RemoteMediaManager.\n *\n * @returns {Promise}\n */\n public async start() {\n if (this.started) {\n throw new Error('start() failure: already started');\n }\n this.started = true;\n\n await this.createAudioMedia();\n\n // todo: create screen share audio remote media (SPARK-377812)\n // todo: create screen share video receive slot (SPARK-377812)\n\n await this.preallocateVideoReceiveSlots();\n\n await this.setLayout(this.config.video.initialLayoutId);\n }\n\n /**\n * Releases all the used resources (like allocated receive slots). This function needs\n * to be called when we leave the meeting, etc.\n */\n public stop() {\n // invalidate all remoteMedia objects\n this.invalidateCurrentRemoteMedia({audio: true, video: true, commit: true});\n\n // release all audio receive slots\n this.slots.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));\n this.slots.audio.length = 0;\n\n // todo: screenshare slots... (SPARK-377812)\n\n this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};\n\n this.slots.video.unused.push(...this.slots.video.activeSpeaker);\n this.slots.video.activeSpeaker.length = 0;\n\n this.slots.video.unused.push(...this.slots.video.receiverSelected);\n this.slots.video.receiverSelected.length = 0;\n\n this.releaseUnusedVideoSlots();\n\n this.currentLayout = undefined;\n this.currentLayoutId = undefined;\n this.started = false;\n }\n\n /**\n * Returns the total number of main video panes required for a given layout\n *\n * @param {VideoLayout} layout\n * @returns {number}\n */\n private getRequiredNumVideoSlotsForLayout(layout?: VideoLayout) {\n if (!layout) {\n return 0;\n }\n\n const activeSpeakerCount =\n layout.activeSpeakerVideoPaneGroups?.reduce(\n (sum, paneGroup) => sum + paneGroup.numPanes,\n 0\n ) || 0;\n\n const receiverSelectedCount = layout.memberVideoPanes?.length || 0;\n\n return activeSpeakerCount + receiverSelectedCount;\n }\n\n /**\n * Allocates the maximum number of panes that any of the configured layouts will require.\n * We do this at the beginning, because it's more efficient (much faster) then allocating receive slots\n * later, after the SDP exchange was done.\n */\n private async preallocateVideoReceiveSlots() {\n const maxNumVideoPanesRequired = Object.values(this.config.video.layouts).reduce(\n (maxValue, layout) => Math.max(maxValue, this.getRequiredNumVideoSlotsForLayout(layout)),\n 0\n );\n\n while (this.slots.video.unused.length < maxNumVideoPanesRequired) {\n // eslint-disable-next-line no-await-in-loop\n this.slots.video.unused.push(\n // eslint-disable-next-line no-await-in-loop\n await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)\n );\n }\n }\n\n /**\n * Changes the layout (triggers Event.VideoLayoutChanged)\n *\n * @param {LayoutId} layoutId new layout id\n * @returns {Promise}\n */\n public async setLayout(layoutId: LayoutId) {\n if (!(layoutId in this.config.video.layouts)) {\n throw new Error(\n `invalid layoutId: \"${layoutId}\" doesn't match any of the configured layouts`\n );\n }\n if (!this.started) {\n throw new Error('setLayout() called before start()');\n }\n this.currentLayoutId = layoutId;\n this.currentLayout = cloneDeep(this.config.video.layouts[this.currentLayoutId]);\n\n await this.updateVideoReceiveSlots();\n this.updateVideoRemoteMediaObjects();\n this.emitVideoLayoutChangedEvent();\n }\n\n /**\n * Returns the currently selected layout id\n *\n * @returns {LayoutId}\n */\n public getLayoutId(): LayoutId | undefined {\n return this.currentLayoutId;\n }\n\n /**\n * Creates the audio slots\n */\n private async createAudioMedia() {\n // create the audio receive slots\n for (let i = 0; i < this.config.audio.numOfActiveSpeakerStreams; i += 1) {\n // eslint-disable-next-line no-await-in-loop\n const slot = await this.receiveSlotManager.allocateSlot(MC.MediaType.AudioMain);\n\n this.slots.audio.push(slot);\n }\n\n // create a remote media group\n this.media.audio = new RemoteMediaGroup(\n this.mediaRequestManagers.audio,\n this.slots.audio,\n 255,\n true\n );\n\n this.emit(\n {file: 'multistream/remoteMediaManager', function: 'createAudioMedia'},\n Event.AudioCreated,\n this.media.audio\n );\n }\n\n /**\n * Goes over all receiver-selected slots and keeps only the ones that are required by a given layout,\n * the rest are all moved to the \"unused\" list\n */\n private trimReceiverSelectedSlots() {\n const requiredCsis = {};\n\n // fill requiredCsis with all the CSIs that the given layout requires\n this.currentLayout?.memberVideoPanes?.forEach((memberVideoPane) => {\n if (memberVideoPane.csi !== undefined) {\n requiredCsis[memberVideoPane.csi] = true;\n }\n });\n\n const isCsiNeededByCurrentLayout = (csi?: CSI): boolean => {\n if (csi === undefined) {\n return false;\n }\n\n return !!requiredCsis[csi];\n };\n\n // keep receiverSelected slots that match our new requiredCsis, move the rest of receiverSelected slots to unused\n const notNeededReceiverSelectedSlots = remove(\n this.slots.video.receiverSelected,\n (slot) => isCsiNeededByCurrentLayout(slot.csi) === false\n );\n\n this.slots.video.unused.push(...notNeededReceiverSelectedSlots);\n }\n\n /**\n * Releases all the \"unused\" video slots.\n */\n private releaseUnusedVideoSlots() {\n this.slots.video.unused.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));\n this.slots.video.unused.length = 0;\n }\n\n /**\n * Allocates receive slots to all video panes in the current selected layout\n */\n private allocateSlotsToVideoPaneGroups() {\n this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};\n\n this.currentLayout?.activeSpeakerVideoPaneGroups?.forEach((group) => {\n this.receiveSlotAllocations.activeSpeaker[group.id] = {slots: []};\n\n for (let paneIndex = 0; paneIndex < group.numPanes; paneIndex += 1) {\n // allocate a slot from the \"unused\" list\n const freeSlot = this.slots.video.unused.pop();\n\n if (freeSlot) {\n this.slots.video.activeSpeaker.push(freeSlot);\n this.receiveSlotAllocations.activeSpeaker[group.id].slots.push(freeSlot);\n }\n }\n });\n\n this.currentLayout?.memberVideoPanes?.forEach((memberPane) => {\n // check if there is existing slot for this csi\n const existingSlot = this.slots.video.receiverSelected.find(\n (slot) => slot.csi === memberPane.csi\n );\n\n const isExistingSlotAlreadyAllocated = Object.values(\n this.receiveSlotAllocations.receiverSelected\n ).includes(existingSlot);\n\n if (memberPane.csi !== undefined && existingSlot && !isExistingSlotAlreadyAllocated) {\n // found it, so use it\n this.receiveSlotAllocations.receiverSelected[memberPane.id] = existingSlot;\n } else {\n // allocate a slot from the \"unused\" list\n const freeSlot = this.slots.video.unused.pop();\n\n if (freeSlot) {\n this.slots.video.receiverSelected.push(freeSlot);\n this.receiveSlotAllocations.receiverSelected[memberPane.id] = freeSlot;\n }\n }\n });\n }\n\n /**\n * Makes sure we have the right number of receive slots created for the current layout\n * and allocates them to the right video panes / pane groups\n *\n * @returns {Promise}\n */\n private async updateVideoReceiveSlots() {\n const requiredNumSlots = this.getRequiredNumVideoSlotsForLayout(this.currentLayout);\n const totalNumSlots =\n this.slots.video.unused.length +\n this.slots.video.activeSpeaker.length +\n this.slots.video.receiverSelected.length;\n\n // ensure we have enough total slots for current layout\n if (totalNumSlots < requiredNumSlots) {\n let numSlotsToCreate = requiredNumSlots - totalNumSlots;\n\n while (numSlotsToCreate > 0) {\n // eslint-disable-next-line no-await-in-loop\n this.slots.video.unused.push(\n // eslint-disable-next-line no-await-in-loop\n await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain)\n );\n numSlotsToCreate -= 1;\n }\n }\n\n // move all no longer needed receiver-selected slots to \"unused\"\n this.trimReceiverSelectedSlots();\n\n // move all active speaker slots to \"unused\"\n this.slots.video.unused.push(...this.slots.video.activeSpeaker);\n this.slots.video.activeSpeaker.length = 0;\n\n // allocate the slots to the right panes / pane groups\n this.allocateSlotsToVideoPaneGroups();\n\n LoggerProxy.logger.log(\n `RemoteMediaManager#updateVideoReceiveSlots --> receive slots updated: unused=${this.slots.video.unused.length}, activeSpeaker=${this.slots.video.activeSpeaker.length}, receiverSelected=${this.slots.video.receiverSelected.length}`\n );\n\n // If this is the initial layout, there may be some \"unused\" slots left because of the preallocation\n // done in this.preallocateVideoReceiveSlots(), so release them now\n this.releaseUnusedVideoSlots();\n }\n\n /**\n * Creates new RemoteMedia and RemoteMediaGroup objects for the current layout\n * and sends the media requests for all of them.\n */\n private updateVideoRemoteMediaObjects() {\n // invalidate all the previous remote media objects and cancel their media requests\n this.invalidateCurrentRemoteMedia({audio: false, video: true, commit: false});\n\n // create new remoteMediaGroup objects\n this.media.video.activeSpeakerGroups = {};\n this.media.video.memberPanes = {};\n\n for (const [groupId, group] of Object.entries(this.receiveSlotAllocations.activeSpeaker)) {\n const paneGroupInCurrentLayout = this.currentLayout?.activeSpeakerVideoPaneGroups?.find(\n (groupInLayout) => groupInLayout.id === groupId\n );\n\n if (paneGroupInCurrentLayout) {\n const mediaGroup = new RemoteMediaGroup(\n this.mediaRequestManagers.video,\n group.slots,\n paneGroupInCurrentLayout.priority,\n false,\n {\n preferLiveVideo: this.config.video.preferLiveVideo,\n resolution: paneGroupInCurrentLayout.size,\n }\n );\n\n this.media.video.activeSpeakerGroups[groupId] = mediaGroup;\n } else {\n // this should never happen, because this.receiveSlotAllocations are created based on current layout configuration\n LoggerProxy.logger.warn(\n `a group id ${groupId} from this.receiveSlotAllocations.activeSpeaker cannot be found in the current layout configuration`\n );\n }\n }\n\n // create new remoteMedia objects\n for (const [paneId, slot] of Object.entries(this.receiveSlotAllocations.receiverSelected)) {\n const paneInCurrentLayout = this.currentLayout?.memberVideoPanes?.find(\n (paneInLayout) => paneInLayout.id === paneId\n );\n\n if (paneInCurrentLayout) {\n const remoteMedia = new RemoteMedia(slot, this.mediaRequestManagers.video, {\n resolution: paneInCurrentLayout.size,\n });\n\n if (paneInCurrentLayout.csi) {\n remoteMedia.sendMediaRequest(paneInCurrentLayout.csi, false);\n }\n\n this.media.video.memberPanes[paneId] = remoteMedia;\n } else {\n // this should never happen, because this.receiveSlotAllocations are created based on current layout configuration\n LoggerProxy.logger.warn(\n `a pane id ${paneId} from this.receiveSlotAllocations.receiverSelected cannot be found in the current layout configuration`\n );\n }\n }\n // todo: screenshare (SPARK-377812)\n\n this.mediaRequestManagers.video.commit();\n }\n\n /**\n * Invalidates all remote media objects belonging to currently selected layout\n */\n private invalidateCurrentRemoteMedia(options: {audio: boolean; video: boolean; commit: boolean}) {\n const {audio, video, commit} = options;\n\n if (audio && this.media.audio) {\n this.media.audio.stop(commit);\n }\n if (video) {\n Object.values(this.media.video.activeSpeakerGroups).forEach((remoteMediaGroup) => {\n remoteMediaGroup.stop(false);\n });\n Object.values(this.media.video.memberPanes).forEach((remoteMedia) => {\n remoteMedia.stop(false);\n });\n if (commit) {\n this.mediaRequestManagers.video.commit();\n }\n }\n }\n\n /** emits Event.VideoLayoutChanged */\n private emitVideoLayoutChangedEvent() {\n // todo: at this point the receive slots might still be showing a participant from previous layout, we should\n // wait for our media requests to be fullfilled, but there is no API for that right now (we could wait for source updates\n // but in some cases they might never come, or would need to always make sure to use a new set of receiver slots)\n // for now it's fine to have it like this, we will re-evaluate if it needs improving after more testing\n\n this.emit(\n {\n file: 'multistream/remoteMediaManager',\n function: 'emitVideoLayoutChangedEvent',\n },\n Event.VideoLayoutChanged,\n {\n layoutId: this.currentLayoutId,\n activeSpeakerVideoPanes: this.media.video.activeSpeakerGroups,\n memberVideoPanes: this.media.video.memberPanes,\n screenShareVideo: undefined, // todo: screen share (SPARK-377812)\n }\n );\n }\n\n /**\n * Sets a new CSI on a given remote media object\n *\n * @param {RemoteMedia} remoteMedia remote Media object to modify\n * @param {CSI} csi new CSI value, can be null if we want to stop receiving media\n */\n public setRemoteVideoCsi(remoteMedia: RemoteMedia, csi: CSI | null) {\n if (!Object.values(this.media.video.memberPanes).includes(remoteMedia)) {\n throw new Error('remoteMedia not found');\n }\n\n if (csi) {\n remoteMedia.sendMediaRequest(csi, true);\n } else {\n remoteMedia.cancelMediaRequest(true);\n }\n }\n\n /**\n * Adds a new member video pane to the currently selected layout.\n *\n * Changes to the layout are lost after a layout change.\n *\n * @param {MemberVideoPane} newPane\n * @returns {Promise<RemoteMedia>}\n */\n public async addMemberVideoPane(newPane: MemberVideoPane): Promise<RemoteMedia> {\n if (!this.currentLayout) {\n throw new Error('There is no current layout selected, call start() first');\n }\n\n if (!this.currentLayout?.memberVideoPanes) {\n this.currentLayout.memberVideoPanes = [];\n }\n\n if (newPane.id in this.currentLayout.memberVideoPanes) {\n throw new Error(\n `duplicate pane id ${newPane.id} - this pane already exists in current layout's memberVideoPanes`\n );\n }\n\n this.currentLayout.memberVideoPanes.push(newPane);\n\n const receiveSlot = await this.receiveSlotManager.allocateSlot(MC.MediaType.VideoMain);\n\n this.slots.video.receiverSelected.push(receiveSlot);\n\n const remoteMedia = new RemoteMedia(receiveSlot, this.mediaRequestManagers.video, {\n resolution: newPane.size,\n });\n\n if (newPane.csi) {\n remoteMedia.sendMediaRequest(newPane.csi, true);\n }\n\n this.media.video.memberPanes[newPane.id] = remoteMedia;\n\n return remoteMedia;\n }\n\n /**\n * Removes a member video pane from the currently selected layout.\n *\n * Changes to the layout are lost after a layout change.\n *\n * @param {PaneId} paneId pane id of the pane to remove\n * @returns {Promise<void>}\n */\n public removeMemberVideoPane(paneId: PaneId): Promise<void> {\n if (!this.currentLayout) {\n return Promise.reject(new Error('There is no current layout selected, call start() first'));\n }\n\n if (!this.currentLayout.memberVideoPanes?.find((pane) => pane.id === paneId)) {\n // pane id doesn't exist, so nothing to do\n LoggerProxy.logger.log(\n `RemoteMediaManager#removeMemberVideoPane --> removeMemberVideoPane() called for a non-existent paneId: ${paneId} (pane not found in currentLayout.memberVideoPanes)`\n );\n\n return Promise.resolve();\n }\n\n if (!this.media.video.memberPanes[paneId]) {\n // pane id doesn't exist, so nothing to do\n LoggerProxy.logger.log(\n `RemoteMediaManager#removeMemberVideoPane --> removeMemberVideoPane() called for a non-existent paneId: ${paneId} (pane not found in this.media.video.memberPanes)`\n );\n\n return Promise.resolve();\n }\n\n const remoteMedia = this.media.video.memberPanes[paneId];\n\n const receiveSlot = remoteMedia.getUnderlyingReceiveSlot();\n\n if (receiveSlot) {\n this.receiveSlotManager.releaseSlot(receiveSlot);\n\n const index = this.slots.video.receiverSelected.indexOf(receiveSlot);\n\n if (index >= 0) {\n this.slots.video.receiverSelected.splice(index, 1);\n }\n }\n remoteMedia.stop();\n\n delete this.media.video.memberPanes[paneId];\n delete this.currentLayout.memberVideoPanes?.[paneId];\n\n return Promise.resolve();\n }\n\n /**\n * Pins an active speaker remote media object to the given CSI value. From that moment\n * onwards the remote media will only play audio/video from that specific CSI until\n * unpinActiveSpeakerVideoPane() is called or current layout is changed.\n *\n * @param {RemoteMedia} remoteMedia remote media object reference\n * @param {CSI} csi CSI value to pin to, if undefined, then current CSI value is used\n */\n public pinActiveSpeakerVideoPane(remoteMedia: RemoteMedia, csi?: CSI): void {\n const remoteMediaGroup = Object.values(this.media.video.activeSpeakerGroups).find((group) =>\n group.includes(remoteMedia, 'unpinned')\n );\n\n if (!remoteMediaGroup) {\n throw new Error(\n 'remoteMedia not found among the unpinned remote media from any active speaker group'\n );\n }\n\n remoteMediaGroup.pin(remoteMedia, csi);\n }\n\n /**\n * Unpins a remote media object from the fixed CSI value it was pinned to.\n *\n * @param {RemoteMedia} remoteMedia remote media object reference\n */\n public unpinActiveSpeakerVideoPane(remoteMedia: RemoteMedia) {\n const remoteMediaGroup = Object.values(this.media.video.activeSpeakerGroups).find((group) =>\n group.includes(remoteMedia, 'pinned')\n );\n\n if (!remoteMediaGroup) {\n throw new Error(\n 'remoteMedia not found among the pinned remote media from any active speaker group'\n );\n }\n\n remoteMediaGroup.unpin(remoteMedia);\n }\n\n /**\n * Returns true if a given remote media object belongs to an active speaker group and has been pinned.\n * Throws an error if the remote media object doesn't belong to any active speaker remote media group.\n *\n * @param {RemoteMedia} remoteMedia remote media object\n * @returns {boolean}\n */\n public isPinned(remoteMedia: RemoteMedia) {\n const remoteMediaGroup = Object.values(this.media.video.activeSpeakerGroups).find((group) =>\n group.includes(remoteMedia)\n );\n\n if (!remoteMediaGroup) {\n throw new Error(\n 'remoteMedia not found among any remote media (pinned or unpinned) from any active speaker group'\n );\n }\n\n return remoteMediaGroup.isPinned(remoteMedia);\n }\n}\n"],"mappings":"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"}
@@ -1,51 +1,33 @@
1
1
  "use strict";
2
2
 
3
3
  var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
-
5
4
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
6
-
7
5
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
8
-
9
6
  _Object$defineProperty(exports, "__esModule", {
10
7
  value: true
11
8
  });
12
-
13
9
  exports.default = void 0;
14
-
15
10
  var _freeze = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/freeze"));
16
-
17
11
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
18
-
19
12
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
20
-
21
13
  var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
22
-
23
14
  var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
24
-
25
15
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
26
-
27
16
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
28
-
29
17
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
30
-
31
18
  var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
32
-
33
19
  var _constants = require("../constants");
34
-
35
20
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
36
-
37
21
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
38
-
39
22
  /**
40
- * Meeting - network quality event
41
- * Emitted on each interval of retrieving stats Analyzer data
42
- * @event network:quality
43
- * @type {Object}
44
- * @property {string} mediaType {video|audio}
45
- * @property {number} networkQualityScore - value determined in determineUplinkNetworkQuality
46
- * @memberof NetworkQualityMonitor
47
- */
48
-
23
+ * Meeting - network quality event
24
+ * Emitted on each interval of retrieving stats Analyzer data
25
+ * @event network:quality
26
+ * @type {Object}
27
+ * @property {string} mediaType {video|audio}
28
+ * @property {number} networkQualityScore - value determined in determineUplinkNetworkQuality
29
+ * @memberof NetworkQualityMonitor
30
+ */
49
31
  /**
50
32
  * NetworkQualityMonitor class that will emit events based on detected quality
51
33
  *
@@ -54,9 +36,7 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_R
54
36
  */
55
37
  var NetworkQualityMonitor = /*#__PURE__*/function (_EventsScope) {
56
38
  (0, _inherits2.default)(NetworkQualityMonitor, _EventsScope);
57
-
58
39
  var _super = _createSuper(NetworkQualityMonitor);
59
-
60
40
  /**
61
41
  * Creates a new instance of NetworkQualityMonitor
62
42
  * @constructor
@@ -70,9 +50,7 @@ var NetworkQualityMonitor = /*#__PURE__*/function (_EventsScope) {
70
50
  */
71
51
  function NetworkQualityMonitor(config) {
72
52
  var _this$frequencyTypes$;
73
-
74
53
  var _this;
75
-
76
54
  (0, _classCallCheck2.default)(this, NetworkQualityMonitor);
77
55
  _this = _super.call(this);
78
56
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "config", void 0);
@@ -96,14 +74,13 @@ var NetworkQualityMonitor = /*#__PURE__*/function (_EventsScope) {
96
74
  _this.mediaType = null;
97
75
  return _this;
98
76
  }
77
+
99
78
  /**
100
79
  * emits NETWORK_QUALITY event on meeting with payload of media type and uplinkNetworkQuality score
101
80
  *
102
81
  * @memberof NetworkQualityMonitor
103
82
  * @returns {void}
104
83
  */
105
-
106
-
107
84
  (0, _createClass2.default)(NetworkQualityMonitor, [{
108
85
  key: "emitNetworkQuality",
109
86
  value: function emitNetworkQuality() {
@@ -115,20 +92,22 @@ var NetworkQualityMonitor = /*#__PURE__*/function (_EventsScope) {
115
92
  networkQualityScore: this.networkQualityScore
116
93
  });
117
94
  }
95
+
118
96
  /**
119
97
  * invokes emitNetworkQuality method resets values back to default
120
98
  * @returns {void}
121
99
  * @memberof NetworkQualityMonitor
122
100
  */
123
-
124
101
  }, {
125
102
  key: "updateNetworkQualityStatus",
126
103
  value: function updateNetworkQualityStatus() {
127
- this.emitNetworkQuality(); // reset values
104
+ this.emitNetworkQuality();
128
105
 
106
+ // reset values
129
107
  this.networkQualityScore = 1;
130
108
  this.mediaType = null;
131
109
  }
110
+
132
111
  /**
133
112
  * filter data to determine uplink network quality, invoked on same interval as stats analyzer remote-inbout-rtp
134
113
  * @param {Object} configObj
@@ -139,108 +118,101 @@ var NetworkQualityMonitor = /*#__PURE__*/function (_EventsScope) {
139
118
  * @public
140
119
  * @memberof NetworkQualityMonitor
141
120
  */
142
-
143
121
  }, {
144
122
  key: "determineUplinkNetworkQuality",
145
123
  value: function determineUplinkNetworkQuality(_ref) {
146
124
  var _this2 = this;
147
-
148
125
  var mediaType = _ref.mediaType,
149
- remoteRtpResults = _ref.remoteRtpResults,
150
- statsAnalyzerCurrentStats = _ref.statsAnalyzerCurrentStats;
126
+ remoteRtpResults = _ref.remoteRtpResults,
127
+ statsAnalyzerCurrentStats = _ref.statsAnalyzerCurrentStats;
151
128
  var roundTripTimeInMilliseconds = remoteRtpResults.roundTripTime * 1000;
152
129
  var jitterInMilliseconds = remoteRtpResults.jitter * 1000;
153
130
  var currentPacketLossRatio = statsAnalyzerCurrentStats[mediaType].send.currentPacketLossRatio;
154
131
  this.mediaType = mediaType;
155
132
  var _this$indicatorTypes = this.indicatorTypes,
156
- JITTER = _this$indicatorTypes.JITTER,
157
- PACKETLOSS = _this$indicatorTypes.PACKETLOSS,
158
- LATENCY = _this$indicatorTypes.LATENCY;
133
+ JITTER = _this$indicatorTypes.JITTER,
134
+ PACKETLOSS = _this$indicatorTypes.PACKETLOSS,
135
+ LATENCY = _this$indicatorTypes.LATENCY;
159
136
  var UPLINK = this.frequencyTypes.UPLINK;
137
+
160
138
  /**
161
139
  * determines if packetLoss ratio is over threshold set in config
162
140
  * sets networkQualityScore to 0 if over threshold
163
141
  * @returns {boolean}
164
142
  */
165
-
166
143
  var determinePacketLoss = function determinePacketLoss() {
167
144
  if (currentPacketLossRatio > _this2.config.videoPacketLossRatioThreshold) {
168
145
  _this2.networkQualityScore = 0;
169
146
  return false;
170
147
  }
171
-
172
148
  return true;
173
149
  };
150
+
174
151
  /**
175
152
  * determines if round trip time value is over threshold set in config
176
153
  * sets networkQualityScore to 0 if over threshold
177
154
  * @returns {boolean}
178
155
  */
179
-
180
-
181
156
  var determineLatency = function determineLatency() {
182
157
  if (roundTripTimeInMilliseconds > _this2.config.rttThreshold) {
183
158
  _this2.networkQualityScore = 0;
184
159
  return false;
185
160
  }
186
-
187
161
  return true;
188
162
  };
163
+
189
164
  /**
190
165
  * determines if jitter value is over threshold in config
191
166
  * sets networkQualityScore to 0 if over threshold
192
167
  * @returns {boolean}
193
168
  */
194
-
195
-
196
169
  var deterMineJitter = function deterMineJitter() {
197
170
  if (jitterInMilliseconds > _this2.config.jitterThreshold) {
198
171
  _this2.networkQualityScore = 0;
199
172
  return false;
200
173
  }
201
-
202
174
  return true;
203
175
  };
176
+
204
177
  /**
205
178
  * returns null if val is specifically undefined
206
179
  * @param {(number|undefined)} value
207
180
  * @returns {(number|null)}
208
181
  */
209
-
210
-
211
182
  var determineIfUndefined = function determineIfUndefined(value) {
212
183
  return typeof value === 'undefined' ? null : value;
213
184
  };
185
+
214
186
  /**
215
187
  * Values for some browsers specifically Safari will be undefined we explicitly set to null
216
188
  * https://bugs.webkit.org/show_bug.cgi?id=206645
217
189
  * https://bugs.webkit.org/show_bug.cgi?id=212668
218
190
  */
219
191
  // PACKET LOSS
220
-
221
-
222
192
  this.networkQualityStatus[UPLINK][mediaType][PACKETLOSS] = {
223
193
  acceptable: determinePacketLoss(),
224
194
  value: determineIfUndefined(currentPacketLossRatio)
225
- }; // LATENCY measured in Round trip time
195
+ };
226
196
 
197
+ // LATENCY measured in Round trip time
227
198
  this.networkQualityStatus[UPLINK][mediaType][LATENCY] = {
228
199
  acceptable: determineLatency(),
229
200
  value: determineIfUndefined(remoteRtpResults.roundTripTime)
230
- }; // JITTER
201
+ };
231
202
 
203
+ // JITTER
232
204
  this.networkQualityStatus[UPLINK][mediaType][JITTER] = {
233
205
  acceptable: deterMineJitter(),
234
206
  value: determineIfUndefined(remoteRtpResults.jitter)
235
207
  };
236
208
  this.updateNetworkQualityStatus();
237
209
  }
210
+
238
211
  /**
239
212
  * Get the current status of network quaility object - networkQualityStatus
240
213
  * @returns {Object}
241
214
  * @public
242
215
  */
243
-
244
216
  }, {
245
217
  key: "networkQualityStats",
246
218
  get: function get() {
@@ -250,6 +222,5 @@ var NetworkQualityMonitor = /*#__PURE__*/function (_EventsScope) {
250
222
  }]);
251
223
  return NetworkQualityMonitor;
252
224
  }(_eventsScope.default);
253
-
254
225
  exports.default = NetworkQualityMonitor;
255
226
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["NetworkQualityMonitor","config","indicatorTypes","PACKETLOSS","LATENCY","JITTER","frequencyTypes","UPLINK","DOWNLINK","networkQualityScore","networkQualityStatus","STATS","VIDEO_CORRELATE","AUDIO_CORRELATE","SHARE_CORRELATE","mediaType","emit","file","function","EVENT_TRIGGERS","NETWORK_QUALITY","emitNetworkQuality","remoteRtpResults","statsAnalyzerCurrentStats","roundTripTimeInMilliseconds","roundTripTime","jitterInMilliseconds","jitter","currentPacketLossRatio","send","determinePacketLoss","videoPacketLossRatioThreshold","determineLatency","rttThreshold","deterMineJitter","jitterThreshold","determineIfUndefined","value","acceptable","updateNetworkQualityStatus","EventsScope"],"sources":["index.ts"],"sourcesContent":["import EventsScope from '../common/events/events-scope';\nimport {EVENT_TRIGGERS, STATS} from '../constants';\n\n\n/**\n * Meeting - network quality event\n * Emitted on each interval of retrieving stats Analyzer data\n * @event network:quality\n * @type {Object}\n * @property {string} mediaType {video|audio}\n * @property {number} networkQualityScore - value determined in determineUplinkNetworkQuality\n * @memberof NetworkQualityMonitor\n */\n/**\n * NetworkQualityMonitor class that will emit events based on detected quality\n *\n * @class NetworkQualityMonitor\n * @extends {EventsScope}\n */\nexport default class NetworkQualityMonitor extends EventsScope {\n config: any;\n frequencyTypes: any;\n indicatorTypes: any;\n mediaType: any;\n networkQualityScore: any;\n networkQualityStatus: any;\n\n /**\n * Creates a new instance of NetworkQualityMonitor\n * @constructor\n * @public\n * @param {Object} config\n * @property {Object} indicatorTypes - network properties used to evaluate network quality used as constants\n * @property {Object} frequencyTypes - frequency properties used as constants {uplink|send} {downlink|receive}\n * @property {number} networkQualityScore - 0|1 1 is acceptable 0 is bad/unknown\n * @property {Object} networkQualityStatus - hash object based on indicatorTypes and frequencyTypes\n * @property {string} mediaType - audio|video\n */\n constructor(config: any) {\n super();\n this.config = config;\n this.indicatorTypes = Object.freeze({\n PACKETLOSS: 'packetLoss',\n LATENCY: 'latency',\n JITTER: 'jitter'\n });\n this.frequencyTypes = Object.freeze({\n UPLINK: 'uplink',\n DOWNLINK: 'downlink'\n });\n this.networkQualityScore = 1;\n this.networkQualityStatus = {\n [this.frequencyTypes.UPLINK]: {\n [STATS.VIDEO_CORRELATE]: {},\n [STATS.AUDIO_CORRELATE]: {},\n [STATS.SHARE_CORRELATE]: {}\n }\n };\n this.mediaType = null;\n }\n\n /**\n * emits NETWORK_QUALITY event on meeting with payload of media type and uplinkNetworkQuality score\n *\n * @memberof NetworkQualityMonitor\n * @returns {void}\n */\n emitNetworkQuality() {\n this.emit(\n {\n file: 'networkQualityMonitor',\n function: 'emitNetworkQuality'\n },\n EVENT_TRIGGERS.NETWORK_QUALITY,\n {\n mediaType: this.mediaType,\n networkQualityScore: this.networkQualityScore\n }\n );\n }\n\n /**\n * invokes emitNetworkQuality method resets values back to default\n * @returns {void}\n * @memberof NetworkQualityMonitor\n */\n updateNetworkQualityStatus() {\n this.emitNetworkQuality();\n\n // reset values\n this.networkQualityScore = 1;\n this.mediaType = null;\n }\n\n\n /**\n * filter data to determine uplink network quality, invoked on same interval as stats analyzer remote-inbout-rtp\n * @param {Object} configObj\n * @param {string} configObj.mediaType {audio|video}\n * @param {RTCStats} configObj.remoteRtpResults RTC stats remote obj\n * @param {Object} configObj.statsAnalyzerCurrentStats statsResults\n * @returns {void}\n * @public\n * @memberof NetworkQualityMonitor\n */\n public determineUplinkNetworkQuality({\n mediaType,\n remoteRtpResults,\n statsAnalyzerCurrentStats,\n }: {\n mediaType: string;\n remoteRtpResults: any;\n statsAnalyzerCurrentStats: object;\n }) {\n const roundTripTimeInMilliseconds = remoteRtpResults.roundTripTime * 1000;\n const jitterInMilliseconds = remoteRtpResults.jitter * 1000;\n const {currentPacketLossRatio} = statsAnalyzerCurrentStats[mediaType].send;\n\n this.mediaType = mediaType;\n\n const {JITTER, PACKETLOSS, LATENCY} = this.indicatorTypes;\n const {UPLINK} = this.frequencyTypes;\n\n /**\n * determines if packetLoss ratio is over threshold set in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const determinePacketLoss = () => {\n if (currentPacketLossRatio >\n this.config.videoPacketLossRatioThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * determines if round trip time value is over threshold set in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const determineLatency = () => {\n if (roundTripTimeInMilliseconds > this.config.rttThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * determines if jitter value is over threshold in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const deterMineJitter = () => {\n if (jitterInMilliseconds > this.config.jitterThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * returns null if val is specifically undefined\n * @param {(number|undefined)} value\n * @returns {(number|null)}\n */\n const determineIfUndefined = (value: number | undefined) => (typeof value === 'undefined' ? null : value);\n\n /**\n * Values for some browsers specifically Safari will be undefined we explicitly set to null\n * https://bugs.webkit.org/show_bug.cgi?id=206645\n * https://bugs.webkit.org/show_bug.cgi?id=212668\n */\n // PACKET LOSS\n this.networkQualityStatus[UPLINK][mediaType][PACKETLOSS] = {\n acceptable: determinePacketLoss(),\n value: determineIfUndefined(currentPacketLossRatio)\n };\n\n\n // LATENCY measured in Round trip time\n this.networkQualityStatus[UPLINK][mediaType][LATENCY] = {\n acceptable: determineLatency(),\n value: determineIfUndefined(remoteRtpResults.roundTripTime)\n };\n\n // JITTER\n this.networkQualityStatus[UPLINK][mediaType][JITTER] = {\n acceptable: deterMineJitter(),\n value: determineIfUndefined(remoteRtpResults.jitter)\n };\n\n this.updateNetworkQualityStatus();\n }\n\n /**\n * Get the current status of network quaility object - networkQualityStatus\n * @returns {Object}\n * @public\n */\n get networkQualityStats() {\n const {UPLINK} = this.frequencyTypes;\n\n return this.networkQualityStatus[UPLINK];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["NetworkQualityMonitor","config","indicatorTypes","PACKETLOSS","LATENCY","JITTER","frequencyTypes","UPLINK","DOWNLINK","networkQualityScore","networkQualityStatus","STATS","VIDEO_CORRELATE","AUDIO_CORRELATE","SHARE_CORRELATE","mediaType","emit","file","function","EVENT_TRIGGERS","NETWORK_QUALITY","emitNetworkQuality","remoteRtpResults","statsAnalyzerCurrentStats","roundTripTimeInMilliseconds","roundTripTime","jitterInMilliseconds","jitter","currentPacketLossRatio","send","determinePacketLoss","videoPacketLossRatioThreshold","determineLatency","rttThreshold","deterMineJitter","jitterThreshold","determineIfUndefined","value","acceptable","updateNetworkQualityStatus","EventsScope"],"sources":["index.ts"],"sourcesContent":["import EventsScope from '../common/events/events-scope';\nimport {EVENT_TRIGGERS, STATS} from '../constants';\n\n/**\n * Meeting - network quality event\n * Emitted on each interval of retrieving stats Analyzer data\n * @event network:quality\n * @type {Object}\n * @property {string} mediaType {video|audio}\n * @property {number} networkQualityScore - value determined in determineUplinkNetworkQuality\n * @memberof NetworkQualityMonitor\n */\n/**\n * NetworkQualityMonitor class that will emit events based on detected quality\n *\n * @class NetworkQualityMonitor\n * @extends {EventsScope}\n */\nexport default class NetworkQualityMonitor extends EventsScope {\n config: any;\n frequencyTypes: any;\n indicatorTypes: any;\n mediaType: any;\n networkQualityScore: any;\n networkQualityStatus: any;\n\n /**\n * Creates a new instance of NetworkQualityMonitor\n * @constructor\n * @public\n * @param {Object} config\n * @property {Object} indicatorTypes - network properties used to evaluate network quality used as constants\n * @property {Object} frequencyTypes - frequency properties used as constants {uplink|send} {downlink|receive}\n * @property {number} networkQualityScore - 0|1 1 is acceptable 0 is bad/unknown\n * @property {Object} networkQualityStatus - hash object based on indicatorTypes and frequencyTypes\n * @property {string} mediaType - audio|video\n */\n constructor(config: any) {\n super();\n this.config = config;\n this.indicatorTypes = Object.freeze({\n PACKETLOSS: 'packetLoss',\n LATENCY: 'latency',\n JITTER: 'jitter',\n });\n this.frequencyTypes = Object.freeze({\n UPLINK: 'uplink',\n DOWNLINK: 'downlink',\n });\n this.networkQualityScore = 1;\n this.networkQualityStatus = {\n [this.frequencyTypes.UPLINK]: {\n [STATS.VIDEO_CORRELATE]: {},\n [STATS.AUDIO_CORRELATE]: {},\n [STATS.SHARE_CORRELATE]: {},\n },\n };\n this.mediaType = null;\n }\n\n /**\n * emits NETWORK_QUALITY event on meeting with payload of media type and uplinkNetworkQuality score\n *\n * @memberof NetworkQualityMonitor\n * @returns {void}\n */\n emitNetworkQuality() {\n this.emit(\n {\n file: 'networkQualityMonitor',\n function: 'emitNetworkQuality',\n },\n EVENT_TRIGGERS.NETWORK_QUALITY,\n {\n mediaType: this.mediaType,\n networkQualityScore: this.networkQualityScore,\n }\n );\n }\n\n /**\n * invokes emitNetworkQuality method resets values back to default\n * @returns {void}\n * @memberof NetworkQualityMonitor\n */\n updateNetworkQualityStatus() {\n this.emitNetworkQuality();\n\n // reset values\n this.networkQualityScore = 1;\n this.mediaType = null;\n }\n\n /**\n * filter data to determine uplink network quality, invoked on same interval as stats analyzer remote-inbout-rtp\n * @param {Object} configObj\n * @param {string} configObj.mediaType {audio|video}\n * @param {RTCStats} configObj.remoteRtpResults RTC stats remote obj\n * @param {Object} configObj.statsAnalyzerCurrentStats statsResults\n * @returns {void}\n * @public\n * @memberof NetworkQualityMonitor\n */\n public determineUplinkNetworkQuality({\n mediaType,\n remoteRtpResults,\n statsAnalyzerCurrentStats,\n }: {\n mediaType: string;\n remoteRtpResults: any;\n statsAnalyzerCurrentStats: object;\n }) {\n const roundTripTimeInMilliseconds = remoteRtpResults.roundTripTime * 1000;\n const jitterInMilliseconds = remoteRtpResults.jitter * 1000;\n const {currentPacketLossRatio} = statsAnalyzerCurrentStats[mediaType].send;\n\n this.mediaType = mediaType;\n\n const {JITTER, PACKETLOSS, LATENCY} = this.indicatorTypes;\n const {UPLINK} = this.frequencyTypes;\n\n /**\n * determines if packetLoss ratio is over threshold set in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const determinePacketLoss = () => {\n if (currentPacketLossRatio > this.config.videoPacketLossRatioThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * determines if round trip time value is over threshold set in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const determineLatency = () => {\n if (roundTripTimeInMilliseconds > this.config.rttThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * determines if jitter value is over threshold in config\n * sets networkQualityScore to 0 if over threshold\n * @returns {boolean}\n */\n const deterMineJitter = () => {\n if (jitterInMilliseconds > this.config.jitterThreshold) {\n this.networkQualityScore = 0;\n\n return false;\n }\n\n return true;\n };\n\n /**\n * returns null if val is specifically undefined\n * @param {(number|undefined)} value\n * @returns {(number|null)}\n */\n const determineIfUndefined = (value: number | undefined) =>\n typeof value === 'undefined' ? null : value;\n\n /**\n * Values for some browsers specifically Safari will be undefined we explicitly set to null\n * https://bugs.webkit.org/show_bug.cgi?id=206645\n * https://bugs.webkit.org/show_bug.cgi?id=212668\n */\n // PACKET LOSS\n this.networkQualityStatus[UPLINK][mediaType][PACKETLOSS] = {\n acceptable: determinePacketLoss(),\n value: determineIfUndefined(currentPacketLossRatio),\n };\n\n // LATENCY measured in Round trip time\n this.networkQualityStatus[UPLINK][mediaType][LATENCY] = {\n acceptable: determineLatency(),\n value: determineIfUndefined(remoteRtpResults.roundTripTime),\n };\n\n // JITTER\n this.networkQualityStatus[UPLINK][mediaType][JITTER] = {\n acceptable: deterMineJitter(),\n value: determineIfUndefined(remoteRtpResults.jitter),\n };\n\n this.updateNetworkQualityStatus();\n }\n\n /**\n * Get the current status of network quaility object - networkQualityStatus\n * @returns {Object}\n * @public\n */\n get networkQualityStats() {\n const {UPLINK} = this.frequencyTypes;\n\n return this.networkQualityStatus[UPLINK];\n }\n}\n"],"mappings":"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"}