@abrar71/lib-jitsi-meet 0.0.0

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 (350) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +26 -0
  3. package/dist/esm/JitsiConference.js +3692 -0
  4. package/dist/esm/JitsiConference.js.map +1 -0
  5. package/dist/esm/JitsiConferenceErrors.js +126 -0
  6. package/dist/esm/JitsiConferenceErrors.js.map +1 -0
  7. package/dist/esm/JitsiConferenceEventManager.js +424 -0
  8. package/dist/esm/JitsiConferenceEventManager.js.map +1 -0
  9. package/dist/esm/JitsiConferenceEvents.js +431 -0
  10. package/dist/esm/JitsiConferenceEvents.js.map +1 -0
  11. package/dist/esm/JitsiConnection.js +187 -0
  12. package/dist/esm/JitsiConnection.js.map +1 -0
  13. package/dist/esm/JitsiConnectionErrors.js +52 -0
  14. package/dist/esm/JitsiConnectionErrors.js.map +1 -0
  15. package/dist/esm/JitsiConnectionEvents.js +57 -0
  16. package/dist/esm/JitsiConnectionEvents.js.map +1 -0
  17. package/dist/esm/JitsiMediaDevices.js +221 -0
  18. package/dist/esm/JitsiMediaDevices.js.map +1 -0
  19. package/dist/esm/JitsiMediaDevicesEvents.js +29 -0
  20. package/dist/esm/JitsiMediaDevicesEvents.js.map +1 -0
  21. package/dist/esm/JitsiMeetJS.js +499 -0
  22. package/dist/esm/JitsiMeetJS.js.map +1 -0
  23. package/dist/esm/JitsiParticipant.js +323 -0
  24. package/dist/esm/JitsiParticipant.js.map +1 -0
  25. package/dist/esm/JitsiTrackError.js +122 -0
  26. package/dist/esm/JitsiTrackError.js.map +1 -0
  27. package/dist/esm/JitsiTrackErrors.js +91 -0
  28. package/dist/esm/JitsiTrackErrors.js.map +1 -0
  29. package/dist/esm/JitsiTrackEvents.js +60 -0
  30. package/dist/esm/JitsiTrackEvents.js.map +1 -0
  31. package/dist/esm/JitsiTranscriptionStatus.js +15 -0
  32. package/dist/esm/JitsiTranscriptionStatus.js.map +1 -0
  33. package/dist/esm/modules/RTC/BridgeChannel.js +398 -0
  34. package/dist/esm/modules/RTC/BridgeChannel.js.map +1 -0
  35. package/dist/esm/modules/RTC/JitsiLocalTrack.js +896 -0
  36. package/dist/esm/modules/RTC/JitsiLocalTrack.js.map +1 -0
  37. package/dist/esm/modules/RTC/JitsiRemoteTrack.js +427 -0
  38. package/dist/esm/modules/RTC/JitsiRemoteTrack.js.map +1 -0
  39. package/dist/esm/modules/RTC/JitsiTrack.js +453 -0
  40. package/dist/esm/modules/RTC/JitsiTrack.js.map +1 -0
  41. package/dist/esm/modules/RTC/MockClasses.js +388 -0
  42. package/dist/esm/modules/RTC/MockClasses.js.map +1 -0
  43. package/dist/esm/modules/RTC/RTC.js +658 -0
  44. package/dist/esm/modules/RTC/RTC.js.map +1 -0
  45. package/dist/esm/modules/RTC/RTCUtils.js +762 -0
  46. package/dist/esm/modules/RTC/RTCUtils.js.map +1 -0
  47. package/dist/esm/modules/RTC/ScreenObtainer.js +380 -0
  48. package/dist/esm/modules/RTC/ScreenObtainer.js.map +1 -0
  49. package/dist/esm/modules/RTC/TPCUtils.js +803 -0
  50. package/dist/esm/modules/RTC/TPCUtils.js.map +1 -0
  51. package/dist/esm/modules/RTC/TraceablePeerConnection.js +2223 -0
  52. package/dist/esm/modules/RTC/TraceablePeerConnection.js.map +1 -0
  53. package/dist/esm/modules/RTCStats/DefaulLogStorage.js +35 -0
  54. package/dist/esm/modules/RTCStats/DefaulLogStorage.js.map +1 -0
  55. package/dist/esm/modules/RTCStats/RTCStats.js +219 -0
  56. package/dist/esm/modules/RTCStats/RTCStats.js.map +1 -0
  57. package/dist/esm/modules/RTCStats/RTCStatsEvents.js +92 -0
  58. package/dist/esm/modules/RTCStats/RTCStatsEvents.js.map +1 -0
  59. package/dist/esm/modules/RTCStats/interfaces.js +2 -0
  60. package/dist/esm/modules/RTCStats/interfaces.js.map +1 -0
  61. package/dist/esm/modules/browser/BrowserCapabilities.js +345 -0
  62. package/dist/esm/modules/browser/BrowserCapabilities.js.map +1 -0
  63. package/dist/esm/modules/browser/index.js +3 -0
  64. package/dist/esm/modules/browser/index.js.map +1 -0
  65. package/dist/esm/modules/connectivity/ConnectionQuality.js +389 -0
  66. package/dist/esm/modules/connectivity/ConnectionQuality.js.map +1 -0
  67. package/dist/esm/modules/connectivity/IceFailedHandling.js +84 -0
  68. package/dist/esm/modules/connectivity/IceFailedHandling.js.map +1 -0
  69. package/dist/esm/modules/connectivity/NetworkInfo.js +49 -0
  70. package/dist/esm/modules/connectivity/NetworkInfo.js.map +1 -0
  71. package/dist/esm/modules/connectivity/TrackStreamingStatus.js +453 -0
  72. package/dist/esm/modules/connectivity/TrackStreamingStatus.js.map +1 -0
  73. package/dist/esm/modules/detection/ActiveDeviceDetector.js +79 -0
  74. package/dist/esm/modules/detection/ActiveDeviceDetector.js.map +1 -0
  75. package/dist/esm/modules/detection/DetectionEvents.js +58 -0
  76. package/dist/esm/modules/detection/DetectionEvents.js.map +1 -0
  77. package/dist/esm/modules/detection/NoAudioSignalDetection.js +127 -0
  78. package/dist/esm/modules/detection/NoAudioSignalDetection.js.map +1 -0
  79. package/dist/esm/modules/detection/P2PDominantSpeakerDetection.js +47 -0
  80. package/dist/esm/modules/detection/P2PDominantSpeakerDetection.js.map +1 -0
  81. package/dist/esm/modules/detection/TrackVADEmitter.js +190 -0
  82. package/dist/esm/modules/detection/TrackVADEmitter.js.map +1 -0
  83. package/dist/esm/modules/detection/VADAudioAnalyser.js +199 -0
  84. package/dist/esm/modules/detection/VADAudioAnalyser.js.map +1 -0
  85. package/dist/esm/modules/detection/VADNoiseDetection.js +168 -0
  86. package/dist/esm/modules/detection/VADNoiseDetection.js.map +1 -0
  87. package/dist/esm/modules/detection/VADReportingService.js +203 -0
  88. package/dist/esm/modules/detection/VADReportingService.js.map +1 -0
  89. package/dist/esm/modules/detection/VADTalkMutedDetection.js +131 -0
  90. package/dist/esm/modules/detection/VADTalkMutedDetection.js.map +1 -0
  91. package/dist/esm/modules/e2ee/Context.js +274 -0
  92. package/dist/esm/modules/e2ee/Context.js.map +1 -0
  93. package/dist/esm/modules/e2ee/E2EEContext.js +158 -0
  94. package/dist/esm/modules/e2ee/E2EEContext.js.map +1 -0
  95. package/dist/esm/modules/e2ee/E2EEErrors.js +10 -0
  96. package/dist/esm/modules/e2ee/E2EEErrors.js.map +1 -0
  97. package/dist/esm/modules/e2ee/E2EEncryption.js +87 -0
  98. package/dist/esm/modules/e2ee/E2EEncryption.js.map +1 -0
  99. package/dist/esm/modules/e2ee/ExternallyManagedKeyHandler.js +24 -0
  100. package/dist/esm/modules/e2ee/ExternallyManagedKeyHandler.js.map +1 -0
  101. package/dist/esm/modules/e2ee/KeyHandler.js +137 -0
  102. package/dist/esm/modules/e2ee/KeyHandler.js.map +1 -0
  103. package/dist/esm/modules/e2ee/ManagedKeyHandler.js +182 -0
  104. package/dist/esm/modules/e2ee/ManagedKeyHandler.js.map +1 -0
  105. package/dist/esm/modules/e2ee/OlmAdapter.js +860 -0
  106. package/dist/esm/modules/e2ee/OlmAdapter.js.map +1 -0
  107. package/dist/esm/modules/e2ee/SAS.js +128 -0
  108. package/dist/esm/modules/e2ee/SAS.js.map +1 -0
  109. package/dist/esm/modules/e2ee/Worker.js +102 -0
  110. package/dist/esm/modules/e2ee/Worker.js.map +1 -0
  111. package/dist/esm/modules/e2ee/crypto-utils.js +53 -0
  112. package/dist/esm/modules/e2ee/crypto-utils.js.map +1 -0
  113. package/dist/esm/modules/e2ee/utils.js +15 -0
  114. package/dist/esm/modules/e2ee/utils.js.map +1 -0
  115. package/dist/esm/modules/e2eping/e2eping.js +314 -0
  116. package/dist/esm/modules/e2eping/e2eping.js.map +1 -0
  117. package/dist/esm/modules/flags/FeatureFlags.js +36 -0
  118. package/dist/esm/modules/flags/FeatureFlags.js.map +1 -0
  119. package/dist/esm/modules/litemode/LiteModeContext.js +50 -0
  120. package/dist/esm/modules/litemode/LiteModeContext.js.map +1 -0
  121. package/dist/esm/modules/proxyconnection/CustomSignalingLayer.js +98 -0
  122. package/dist/esm/modules/proxyconnection/CustomSignalingLayer.js.map +1 -0
  123. package/dist/esm/modules/proxyconnection/ProxyConnectionPC.js +348 -0
  124. package/dist/esm/modules/proxyconnection/ProxyConnectionPC.js.map +1 -0
  125. package/dist/esm/modules/proxyconnection/ProxyConnectionService.js +279 -0
  126. package/dist/esm/modules/proxyconnection/ProxyConnectionService.js.map +1 -0
  127. package/dist/esm/modules/proxyconnection/constants.js +14 -0
  128. package/dist/esm/modules/proxyconnection/constants.js.map +1 -0
  129. package/dist/esm/modules/qualitycontrol/CodecSelection.js +222 -0
  130. package/dist/esm/modules/qualitycontrol/CodecSelection.js.map +1 -0
  131. package/dist/esm/modules/qualitycontrol/MockClasses.js +120 -0
  132. package/dist/esm/modules/qualitycontrol/MockClasses.js.map +1 -0
  133. package/dist/esm/modules/qualitycontrol/QualityController.js +366 -0
  134. package/dist/esm/modules/qualitycontrol/QualityController.js.map +1 -0
  135. package/dist/esm/modules/qualitycontrol/ReceiveAudioController.js +73 -0
  136. package/dist/esm/modules/qualitycontrol/ReceiveAudioController.js.map +1 -0
  137. package/dist/esm/modules/qualitycontrol/ReceiveVideoController.js +216 -0
  138. package/dist/esm/modules/qualitycontrol/ReceiveVideoController.js.map +1 -0
  139. package/dist/esm/modules/qualitycontrol/SendVideoController.js +133 -0
  140. package/dist/esm/modules/qualitycontrol/SendVideoController.js.map +1 -0
  141. package/dist/esm/modules/recording/JibriSession.js +279 -0
  142. package/dist/esm/modules/recording/JibriSession.js.map +1 -0
  143. package/dist/esm/modules/recording/RecordingManager.js +257 -0
  144. package/dist/esm/modules/recording/RecordingManager.js.map +1 -0
  145. package/dist/esm/modules/recording/recordingConstants.js +21 -0
  146. package/dist/esm/modules/recording/recordingConstants.js.map +1 -0
  147. package/dist/esm/modules/recording/recordingXMLUtils.js +69 -0
  148. package/dist/esm/modules/recording/recordingXMLUtils.js.map +1 -0
  149. package/dist/esm/modules/red/red.js +108 -0
  150. package/dist/esm/modules/red/red.js.map +1 -0
  151. package/dist/esm/modules/sdp/LocalSdpMunger.js +143 -0
  152. package/dist/esm/modules/sdp/LocalSdpMunger.js.map +1 -0
  153. package/dist/esm/modules/sdp/RtxModifier.js +179 -0
  154. package/dist/esm/modules/sdp/RtxModifier.js.map +1 -0
  155. package/dist/esm/modules/sdp/SDP.js +848 -0
  156. package/dist/esm/modules/sdp/SDP.js.map +1 -0
  157. package/dist/esm/modules/sdp/SDPDiffer.js +96 -0
  158. package/dist/esm/modules/sdp/SDPDiffer.js.map +1 -0
  159. package/dist/esm/modules/sdp/SDPUtil.js +798 -0
  160. package/dist/esm/modules/sdp/SDPUtil.js.map +1 -0
  161. package/dist/esm/modules/sdp/SampleSdpStrings.js +589 -0
  162. package/dist/esm/modules/sdp/SampleSdpStrings.js.map +1 -0
  163. package/dist/esm/modules/sdp/SdpSimulcast.js +196 -0
  164. package/dist/esm/modules/sdp/SdpSimulcast.js.map +1 -0
  165. package/dist/esm/modules/sdp/SdpTransformUtil.js +337 -0
  166. package/dist/esm/modules/sdp/SdpTransformUtil.js.map +1 -0
  167. package/dist/esm/modules/sdp/constants.js +2 -0
  168. package/dist/esm/modules/sdp/constants.js.map +1 -0
  169. package/dist/esm/modules/settings/Settings.js +95 -0
  170. package/dist/esm/modules/settings/Settings.js.map +1 -0
  171. package/dist/esm/modules/statistics/AnalyticsAdapter.js +277 -0
  172. package/dist/esm/modules/statistics/AnalyticsAdapter.js.map +1 -0
  173. package/dist/esm/modules/statistics/AvgRTPStatsReporter.js +817 -0
  174. package/dist/esm/modules/statistics/AvgRTPStatsReporter.js.map +1 -0
  175. package/dist/esm/modules/statistics/LocalStatsCollector.js +149 -0
  176. package/dist/esm/modules/statistics/LocalStatsCollector.js.map +1 -0
  177. package/dist/esm/modules/statistics/PreCallTest.js +15 -0
  178. package/dist/esm/modules/statistics/PreCallTest.js.map +1 -0
  179. package/dist/esm/modules/statistics/RTPStatsCollector.js +601 -0
  180. package/dist/esm/modules/statistics/RTPStatsCollector.js.map +1 -0
  181. package/dist/esm/modules/statistics/SpeakerStats.js +163 -0
  182. package/dist/esm/modules/statistics/SpeakerStats.js.map +1 -0
  183. package/dist/esm/modules/statistics/SpeakerStatsCollector.js +161 -0
  184. package/dist/esm/modules/statistics/SpeakerStatsCollector.js.map +1 -0
  185. package/dist/esm/modules/statistics/constants.js +7 -0
  186. package/dist/esm/modules/statistics/constants.js.map +1 -0
  187. package/dist/esm/modules/statistics/statistics.js +362 -0
  188. package/dist/esm/modules/statistics/statistics.js.map +1 -0
  189. package/dist/esm/modules/util/AsyncQueue.js +102 -0
  190. package/dist/esm/modules/util/AsyncQueue.js.map +1 -0
  191. package/dist/esm/modules/util/Deferred.js +41 -0
  192. package/dist/esm/modules/util/Deferred.js.map +1 -0
  193. package/dist/esm/modules/util/EventEmitter.js +17 -0
  194. package/dist/esm/modules/util/EventEmitter.js.map +1 -0
  195. package/dist/esm/modules/util/EventEmitterForwarder.js +52 -0
  196. package/dist/esm/modules/util/EventEmitterForwarder.js.map +1 -0
  197. package/dist/esm/modules/util/Listenable.js +106 -0
  198. package/dist/esm/modules/util/Listenable.js.map +1 -0
  199. package/dist/esm/modules/util/MathUtil.js +103 -0
  200. package/dist/esm/modules/util/MathUtil.js.map +1 -0
  201. package/dist/esm/modules/util/RandomUtil.js +66 -0
  202. package/dist/esm/modules/util/RandomUtil.js.map +1 -0
  203. package/dist/esm/modules/util/Retry.js +15 -0
  204. package/dist/esm/modules/util/Retry.js.map +1 -0
  205. package/dist/esm/modules/util/ScriptUtil.js +58 -0
  206. package/dist/esm/modules/util/ScriptUtil.js.map +1 -0
  207. package/dist/esm/modules/util/StringUtils.js +21 -0
  208. package/dist/esm/modules/util/StringUtils.js.map +1 -0
  209. package/dist/esm/modules/util/TestUtils.js +14 -0
  210. package/dist/esm/modules/util/TestUtils.js.map +1 -0
  211. package/dist/esm/modules/util/UsernameGenerator.js +436 -0
  212. package/dist/esm/modules/util/UsernameGenerator.js.map +1 -0
  213. package/dist/esm/modules/util/XMLUtils.js +135 -0
  214. package/dist/esm/modules/util/XMLUtils.js.map +1 -0
  215. package/dist/esm/modules/version/ComponentsVersions.js +52 -0
  216. package/dist/esm/modules/version/ComponentsVersions.js.map +1 -0
  217. package/dist/esm/modules/videosipgw/JitsiVideoSIPGWSession.js +137 -0
  218. package/dist/esm/modules/videosipgw/JitsiVideoSIPGWSession.js.map +1 -0
  219. package/dist/esm/modules/videosipgw/VideoSIPGW.js +102 -0
  220. package/dist/esm/modules/videosipgw/VideoSIPGW.js.map +1 -0
  221. package/dist/esm/modules/videosipgw/VideoSIPGWConstants.js +65 -0
  222. package/dist/esm/modules/videosipgw/VideoSIPGWConstants.js.map +1 -0
  223. package/dist/esm/modules/watchRTC/WatchRTC.js +69 -0
  224. package/dist/esm/modules/watchRTC/WatchRTC.js.map +1 -0
  225. package/dist/esm/modules/watchRTC/functions.js +31 -0
  226. package/dist/esm/modules/watchRTC/functions.js.map +1 -0
  227. package/dist/esm/modules/watchRTC/interfaces.js +2 -0
  228. package/dist/esm/modules/watchRTC/interfaces.js.map +1 -0
  229. package/dist/esm/modules/webaudio/AudioMixer.js +74 -0
  230. package/dist/esm/modules/webaudio/AudioMixer.js.map +1 -0
  231. package/dist/esm/modules/webaudio/WebAudioUtils.js +13 -0
  232. package/dist/esm/modules/webaudio/WebAudioUtils.js.map +1 -0
  233. package/dist/esm/modules/xmpp/AVModeration.js +156 -0
  234. package/dist/esm/modules/xmpp/AVModeration.js.map +1 -0
  235. package/dist/esm/modules/xmpp/BreakoutRooms.js +230 -0
  236. package/dist/esm/modules/xmpp/BreakoutRooms.js.map +1 -0
  237. package/dist/esm/modules/xmpp/Caps.js +223 -0
  238. package/dist/esm/modules/xmpp/Caps.js.map +1 -0
  239. package/dist/esm/modules/xmpp/ChatRoom.js +1877 -0
  240. package/dist/esm/modules/xmpp/ChatRoom.js.map +1 -0
  241. package/dist/esm/modules/xmpp/ConnectionPlugin.js +37 -0
  242. package/dist/esm/modules/xmpp/ConnectionPlugin.js.map +1 -0
  243. package/dist/esm/modules/xmpp/FileSharing.js +95 -0
  244. package/dist/esm/modules/xmpp/FileSharing.js.map +1 -0
  245. package/dist/esm/modules/xmpp/JingleHelperFunctions.js +168 -0
  246. package/dist/esm/modules/xmpp/JingleHelperFunctions.js.map +1 -0
  247. package/dist/esm/modules/xmpp/JingleSession.js +166 -0
  248. package/dist/esm/modules/xmpp/JingleSession.js.map +1 -0
  249. package/dist/esm/modules/xmpp/JingleSessionPC.js +1969 -0
  250. package/dist/esm/modules/xmpp/JingleSessionPC.js.map +1 -0
  251. package/dist/esm/modules/xmpp/JingleSessionState.js +23 -0
  252. package/dist/esm/modules/xmpp/JingleSessionState.js.map +1 -0
  253. package/dist/esm/modules/xmpp/Lobby.js +384 -0
  254. package/dist/esm/modules/xmpp/Lobby.js.map +1 -0
  255. package/dist/esm/modules/xmpp/MediaSessionEvents.js +12 -0
  256. package/dist/esm/modules/xmpp/MediaSessionEvents.js.map +1 -0
  257. package/dist/esm/modules/xmpp/MockClasses.js +77 -0
  258. package/dist/esm/modules/xmpp/MockClasses.js.map +1 -0
  259. package/dist/esm/modules/xmpp/Polls.js +87 -0
  260. package/dist/esm/modules/xmpp/Polls.js.map +1 -0
  261. package/dist/esm/modules/xmpp/ResumeTask.js +149 -0
  262. package/dist/esm/modules/xmpp/ResumeTask.js.map +1 -0
  263. package/dist/esm/modules/xmpp/RoomMetadata.js +96 -0
  264. package/dist/esm/modules/xmpp/RoomMetadata.js.map +1 -0
  265. package/dist/esm/modules/xmpp/SignalingLayerImpl.js +313 -0
  266. package/dist/esm/modules/xmpp/SignalingLayerImpl.js.map +1 -0
  267. package/dist/esm/modules/xmpp/StropheErrorHandler.js +53 -0
  268. package/dist/esm/modules/xmpp/StropheErrorHandler.js.map +1 -0
  269. package/dist/esm/modules/xmpp/StropheLastSuccess.js +52 -0
  270. package/dist/esm/modules/xmpp/StropheLastSuccess.js.map +1 -0
  271. package/dist/esm/modules/xmpp/XmppConnection.js +579 -0
  272. package/dist/esm/modules/xmpp/XmppConnection.js.map +1 -0
  273. package/dist/esm/modules/xmpp/moderator.js +524 -0
  274. package/dist/esm/modules/xmpp/moderator.js.map +1 -0
  275. package/dist/esm/modules/xmpp/sha1.js +165 -0
  276. package/dist/esm/modules/xmpp/sha1.js.map +1 -0
  277. package/dist/esm/modules/xmpp/strophe.disco.js +222 -0
  278. package/dist/esm/modules/xmpp/strophe.disco.js.map +1 -0
  279. package/dist/esm/modules/xmpp/strophe.emuc.js +206 -0
  280. package/dist/esm/modules/xmpp/strophe.emuc.js.map +1 -0
  281. package/dist/esm/modules/xmpp/strophe.jingle.js +404 -0
  282. package/dist/esm/modules/xmpp/strophe.jingle.js.map +1 -0
  283. package/dist/esm/modules/xmpp/strophe.logger.js +44 -0
  284. package/dist/esm/modules/xmpp/strophe.logger.js.map +1 -0
  285. package/dist/esm/modules/xmpp/strophe.ping.js +170 -0
  286. package/dist/esm/modules/xmpp/strophe.ping.js.map +1 -0
  287. package/dist/esm/modules/xmpp/strophe.rayo.js +117 -0
  288. package/dist/esm/modules/xmpp/strophe.rayo.js.map +1 -0
  289. package/dist/esm/modules/xmpp/strophe.stream-management.js +365 -0
  290. package/dist/esm/modules/xmpp/strophe.stream-management.js.map +1 -0
  291. package/dist/esm/modules/xmpp/strophe.util.js +116 -0
  292. package/dist/esm/modules/xmpp/strophe.util.js.map +1 -0
  293. package/dist/esm/modules/xmpp/xmpp.js +973 -0
  294. package/dist/esm/modules/xmpp/xmpp.js.map +1 -0
  295. package/dist/esm/service/RTC/BridgeVideoType.js +24 -0
  296. package/dist/esm/service/RTC/BridgeVideoType.js.map +1 -0
  297. package/dist/esm/service/RTC/CameraFacingMode.js +21 -0
  298. package/dist/esm/service/RTC/CameraFacingMode.js.map +1 -0
  299. package/dist/esm/service/RTC/CodecMimeType.js +36 -0
  300. package/dist/esm/service/RTC/CodecMimeType.js.map +1 -0
  301. package/dist/esm/service/RTC/MediaDirection.js +23 -0
  302. package/dist/esm/service/RTC/MediaDirection.js.map +1 -0
  303. package/dist/esm/service/RTC/MediaType.js +20 -0
  304. package/dist/esm/service/RTC/MediaType.js.map +1 -0
  305. package/dist/esm/service/RTC/RTCEvents.js +111 -0
  306. package/dist/esm/service/RTC/RTCEvents.js.map +1 -0
  307. package/dist/esm/service/RTC/ReceiverAudioSubscription.js +27 -0
  308. package/dist/esm/service/RTC/ReceiverAudioSubscription.js.map +1 -0
  309. package/dist/esm/service/RTC/Resolutions.js +56 -0
  310. package/dist/esm/service/RTC/Resolutions.js.map +1 -0
  311. package/dist/esm/service/RTC/SignalingEvents.js +42 -0
  312. package/dist/esm/service/RTC/SignalingEvents.js.map +1 -0
  313. package/dist/esm/service/RTC/SignalingLayer.js +153 -0
  314. package/dist/esm/service/RTC/SignalingLayer.js.map +1 -0
  315. package/dist/esm/service/RTC/StandardVideoQualitySettings.js +180 -0
  316. package/dist/esm/service/RTC/StandardVideoQualitySettings.js.map +1 -0
  317. package/dist/esm/service/RTC/VideoEncoderScalabilityMode.js +36 -0
  318. package/dist/esm/service/RTC/VideoEncoderScalabilityMode.js.map +1 -0
  319. package/dist/esm/service/RTC/VideoType.js +19 -0
  320. package/dist/esm/service/RTC/VideoType.js.map +1 -0
  321. package/dist/esm/service/authentication/AuthenticationEvents.js +13 -0
  322. package/dist/esm/service/authentication/AuthenticationEvents.js.map +1 -0
  323. package/dist/esm/service/connectivity/ConnectionQualityEvents.js +13 -0
  324. package/dist/esm/service/connectivity/ConnectionQualityEvents.js.map +1 -0
  325. package/dist/esm/service/connectivity/Constants.js +3 -0
  326. package/dist/esm/service/connectivity/Constants.js.map +1 -0
  327. package/dist/esm/service/e2eping/E2ePingEvents.js +8 -0
  328. package/dist/esm/service/e2eping/E2ePingEvents.js.map +1 -0
  329. package/dist/esm/service/statistics/AnalyticsEvents.js +521 -0
  330. package/dist/esm/service/statistics/AnalyticsEvents.js.map +1 -0
  331. package/dist/esm/service/statistics/Events.js +36 -0
  332. package/dist/esm/service/statistics/Events.js.map +1 -0
  333. package/dist/esm/service/statistics/constants.js +2 -0
  334. package/dist/esm/service/statistics/constants.js.map +1 -0
  335. package/dist/esm/service/xmpp/XMPPEvents.js +359 -0
  336. package/dist/esm/service/xmpp/XMPPEvents.js.map +1 -0
  337. package/dist/esm/service/xmpp/XMPPExtensioProtocols.js +64 -0
  338. package/dist/esm/service/xmpp/XMPPExtensioProtocols.js.map +1 -0
  339. package/dist/esm/test-setup-polyfill.js +34 -0
  340. package/dist/esm/test-setup-polyfill.js.map +1 -0
  341. package/dist/esm/tools/gen-version.js +15 -0
  342. package/dist/esm/tools/gen-version.js.map +1 -0
  343. package/dist/esm/version.js +3 -0
  344. package/dist/esm/version.js.map +1 -0
  345. package/dist/umd/lib-jitsi-meet.e2ee-worker.js +484 -0
  346. package/dist/umd/lib-jitsi-meet.min.js +3 -0
  347. package/dist/umd/lib-jitsi-meet.min.js.LICENSE.txt +18 -0
  348. package/dist/umd/lib-jitsi-meet.min.map +1 -0
  349. package/package.json +93 -0
  350. package/types/index.d.ts +16180 -0
@@ -0,0 +1,453 @@
1
+ import { getLogger } from '@jitsi/logger';
2
+ import { JitsiConferenceEvents } from '../../JitsiConferenceEvents';
3
+ import { JitsiTrackEvents } from '../../JitsiTrackEvents';
4
+ import { RTCEvents } from '../../service/RTC/RTCEvents';
5
+ import { createTrackStreamingStatusEvent } from '../../service/statistics/AnalyticsEvents';
6
+ import RTCStats from '../RTCStats/RTCStats';
7
+ import { RTCStatsEvents } from '../RTCStats/RTCStatsEvents';
8
+ import browser from '../browser';
9
+ import Statistics from '../statistics/statistics';
10
+ /** Track streaming statuses. */
11
+ export var TrackStreamingStatus;
12
+ (function (TrackStreamingStatus) {
13
+ /**
14
+ * Status indicating that streaming is currently active.
15
+ */
16
+ TrackStreamingStatus["ACTIVE"] = "active";
17
+ /**
18
+ * Status indicating that streaming is currently inactive.
19
+ * Inactive means the streaming was stopped on purpose from the bridge, like exiting forwarded sources or
20
+ * adaptivity decided to drop video because of not enough bandwidth.
21
+ */
22
+ TrackStreamingStatus["INACTIVE"] = "inactive";
23
+ /**
24
+ * Status indicating that streaming is currently interrupted.
25
+ */
26
+ TrackStreamingStatus["INTERRUPTED"] = "interrupted";
27
+ /**
28
+ * Status indicating that streaming is currently restoring.
29
+ */
30
+ TrackStreamingStatus["RESTORING"] = "restoring";
31
+ })(TrackStreamingStatus || (TrackStreamingStatus = {}));
32
+ const logger = getLogger('connectivity:TrackStreamingStatus');
33
+ /**
34
+ * Default value of 500 milliseconds for {@link TrackStreamingStatusImpl.outOfForwardedSourcesTimeout}.
35
+ */
36
+ const DEFAULT_NOT_IN_FORWARDED_SOURCES_TIMEOUT = 500;
37
+ /**
38
+ * Default value of 2500 milliseconds for {@link TrackStreamingStatusImpl.p2pRtcMuteTimeout}.
39
+ */
40
+ const DEFAULT_P2P_RTC_MUTE_TIMEOUT = 2500;
41
+ /**
42
+ * Default value of 10000 milliseconds for {@link TrackStreamingStatusImpl.rtcMuteTimeout}.
43
+ */
44
+ const DEFAULT_RTC_MUTE_TIMEOUT = 10000;
45
+ /**
46
+ * The time to wait a track to be restored. Track which was out of forwarded sources should be inactive and when
47
+ * entering forwarded sources it becomes restoring and when data is received from bridge it will become active, but if
48
+ * no data is received for some time we set status of that track streaming to interrupted.
49
+ */
50
+ const DEFAULT_RESTORING_TIMEOUT = 10000;
51
+ /**
52
+ * Class is responsible for emitting JitsiTrackEvents.TRACK_STREAMING_STATUS_CHANGED events.
53
+ */
54
+ export class TrackStreamingStatusImpl {
55
+ /* eslint-disable max-params */
56
+ /**
57
+ * Calculates the new {@link TrackStreamingStatus} based on the values given for some specific remote track. It is
58
+ * assumed that the conference is currently in the JVB mode (in contrary to the P2P mode)
59
+ * @param isInForwardedSources - indicates whether the track is in the forwarded sources set. When set to
60
+ * false it means that JVB is not sending any video for the track.
61
+ * @param isRestoringTimedout - if true it means that the track has been outside of forwarded sources too
62
+ * long to be considered {@link TrackStreamingStatus.RESTORING}.
63
+ * @param isVideoMuted - true if the track is video muted and we should not expect to receive any video.
64
+ * @param isVideoTrackFrozen - if the current browser support video frozen detection then it will be set to
65
+ * true when the video track is frozen. If the current browser does not support frozen detection the it's always
66
+ * false.
67
+ * @return {TrackStreamingStatus} the new streaming status for the track for whom the values above were provided.
68
+ * @private
69
+ */
70
+ static _getNewStateForJvbMode(isInForwardedSources, isRestoringTimedout, isVideoMuted, isVideoTrackFrozen) {
71
+ // We are currently not checking the endpoint connection status received from the JVB.
72
+ if (isVideoMuted) {
73
+ // If the connection is active according to JVB and the track is video muted there is no way for the
74
+ // connection to be inactive, because the detection logic below only makes sense for video.
75
+ return TrackStreamingStatus.ACTIVE;
76
+ }
77
+ // Logic when isVideoTrackFrozen is supported
78
+ if (browser.supportsVideoMuteOnConnInterrupted()) {
79
+ if (!isVideoTrackFrozen) {
80
+ // If the video is playing we're good
81
+ return TrackStreamingStatus.ACTIVE;
82
+ }
83
+ else if (isInForwardedSources) {
84
+ return isRestoringTimedout ? TrackStreamingStatus.INTERRUPTED : TrackStreamingStatus.RESTORING;
85
+ }
86
+ return TrackStreamingStatus.INACTIVE;
87
+ }
88
+ // Because this browser is incapable of detecting frozen video we must rely on the forwarded sources value
89
+ return isInForwardedSources ? TrackStreamingStatus.ACTIVE : TrackStreamingStatus.INACTIVE;
90
+ }
91
+ /* eslint-enable max-params */
92
+ /**
93
+ * In P2P mode we don't care about any values coming from the JVB and the streaming status can be only active or
94
+ * interrupted.
95
+ * @param isVideoMuted - true if video muted
96
+ * @param isVideoTrackFrozen - true if the video track for the remote track is currently frozen. If the
97
+ * current browser does not support video frozen detection then it's always false.
98
+ * @return {TrackStreamingStatus}
99
+ * @private
100
+ */
101
+ static _getNewStateForP2PMode(isVideoMuted, isVideoTrackFrozen) {
102
+ if (!browser.supportsVideoMuteOnConnInterrupted()) {
103
+ // There's no way to detect problems in P2P when there's no video track frozen detection...
104
+ return TrackStreamingStatus.ACTIVE;
105
+ }
106
+ return isVideoMuted || !isVideoTrackFrozen
107
+ ? TrackStreamingStatus.ACTIVE : TrackStreamingStatus.INTERRUPTED;
108
+ }
109
+ /**
110
+ * Creates new instance of <tt>TrackStreamingStatus</tt>.
111
+ *
112
+ * @constructor
113
+ * @param rtc - the RTC service instance
114
+ * @param conference - parent conference instance // TODO: Needs JitsiConference Type
115
+ * @param {Object} options
116
+ * @param {number} [options.p2pRtcMuteTimeout=2500] custom value for
117
+ * {@link TrackStreamingStatusImpl.p2pRtcMuteTimeout}.
118
+ * @param {number} [options.rtcMuteTimeout=2000] custom value for
119
+ * {@link TrackStreamingStatusImpl.rtcMuteTimeout}.
120
+ * @param {number} [options.outOfForwardedSourcesTimeout=500] custom value for
121
+ * {@link TrackStreamingStatusImpl.outOfForwardedSourcesTimeout}.
122
+ */
123
+ constructor(rtc, conference, track, options) {
124
+ this.rtc = rtc;
125
+ this.conference = conference;
126
+ this.track = track;
127
+ this.restoringTimer = null;
128
+ this.rtcMutedTimestamp = null;
129
+ this.streamingStatusMap = {};
130
+ this.trackTimer = null;
131
+ this.outOfForwardedSourcesTimeout = typeof options.outOfForwardedSourcesTimeout === 'number'
132
+ ? options.outOfForwardedSourcesTimeout : DEFAULT_NOT_IN_FORWARDED_SOURCES_TIMEOUT;
133
+ this.p2pRtcMuteTimeout = typeof options.p2pRtcMuteTimeout === 'number'
134
+ ? options.p2pRtcMuteTimeout : DEFAULT_P2P_RTC_MUTE_TIMEOUT;
135
+ this.rtcMuteTimeout = typeof options.rtcMuteTimeout === 'number'
136
+ ? options.rtcMuteTimeout : DEFAULT_RTC_MUTE_TIMEOUT;
137
+ logger.info(`RtcMuteTimeout set to: ${this.rtcMuteTimeout}`);
138
+ }
139
+ /**
140
+ * Gets the video frozen timeout for given source name.
141
+ * @return how long are we going to wait since RTC video muted even, before a video track is considered
142
+ * frozen.
143
+ * @private
144
+ */
145
+ _getVideoFrozenTimeout() {
146
+ const sourceName = this.track.getSourceName();
147
+ return this.rtc.isInForwardedSources(sourceName)
148
+ ? this.rtcMuteTimeout
149
+ : this.conference.isP2PActive() ? this.p2pRtcMuteTimeout : this.outOfForwardedSourcesTimeout;
150
+ }
151
+ /**
152
+ * Initializes <tt>TrackStreamingStatus</tt> and bind required event listeners.
153
+ */
154
+ init() {
155
+ // Handles P2P status changes
156
+ this._onP2PStatus = this.figureOutStreamingStatus.bind(this);
157
+ this.conference.on(JitsiConferenceEvents.P2P_STATUS, this._onP2PStatus);
158
+ // Used to send analytics events for the participant that left the call.
159
+ this._onUserLeft = this.onUserLeft.bind(this);
160
+ this.conference.on(JitsiConferenceEvents.USER_LEFT, this._onUserLeft);
161
+ // On some browsers MediaStreamTrack trigger "onmute"/"onunmute" events for video type tracks when they stop
162
+ // receiving data which is often a sign that remote user is having connectivity issues.
163
+ if (browser.supportsVideoMuteOnConnInterrupted()) {
164
+ this._onTrackRtcMuted = this.onTrackRtcMuted.bind(this);
165
+ this.rtc.addListener(RTCEvents.REMOTE_TRACK_MUTE, this._onTrackRtcMuted);
166
+ this._onTrackRtcUnmuted = this.onTrackRtcUnmuted.bind(this);
167
+ this.rtc.addListener(RTCEvents.REMOTE_TRACK_UNMUTE, this._onTrackRtcUnmuted);
168
+ // Listened which will be bound to JitsiRemoteTrack to listen for signalling mute/unmute events.
169
+ this._onSignallingMuteChanged = this.onSignallingMuteChanged.bind(this);
170
+ this.track.on(JitsiTrackEvents.TRACK_MUTE_CHANGED, this._onSignallingMuteChanged);
171
+ // Used to send an analytics event when the video type changes.
172
+ this._onTrackVideoTypeChanged = this.onTrackVideoTypeChanged.bind(this);
173
+ this.track.on(JitsiTrackEvents.TRACK_VIDEOTYPE_CHANGED, this._onTrackVideoTypeChanged);
174
+ }
175
+ this._onForwardedSourcesChanged = this.onForwardedSourcesChanged.bind(this);
176
+ this.conference.on(JitsiConferenceEvents.FORWARDED_SOURCES_CHANGED, this._onForwardedSourcesChanged);
177
+ this._onLastNValueChanged = this.figureOutStreamingStatus.bind(this);
178
+ this.rtc.on(RTCEvents.LASTN_VALUE_CHANGED, this._onLastNValueChanged);
179
+ }
180
+ /**
181
+ * Removes all event listeners and disposes of all resources held by this instance.
182
+ */
183
+ dispose() {
184
+ if (browser.supportsVideoMuteOnConnInterrupted()) {
185
+ this.rtc.removeListener(RTCEvents.REMOTE_TRACK_MUTE, this._onTrackRtcMuted);
186
+ this.rtc.removeListener(RTCEvents.REMOTE_TRACK_UNMUTE, this._onTrackRtcUnmuted);
187
+ this.track.off(JitsiTrackEvents.TRACK_MUTE_CHANGED, this._onSignallingMuteChanged);
188
+ this.track.off(JitsiTrackEvents.TRACK_VIDEOTYPE_CHANGED, this._onTrackVideoTypeChanged);
189
+ }
190
+ this.conference.off(JitsiConferenceEvents.FORWARDED_SOURCES_CHANGED, this._onForwardedSourcesChanged);
191
+ this.conference.off(JitsiConferenceEvents.P2P_STATUS, this._onP2PStatus);
192
+ this.conference.off(JitsiConferenceEvents.USER_LEFT, this._onUserLeft);
193
+ this.rtc.removeListener(RTCEvents.LASTN_VALUE_CHANGED, this._onLastNValueChanged);
194
+ this.clearTimeout();
195
+ this.clearRtcMutedTimestamp();
196
+ this.maybeSendTrackStreamingStatusEvent(Date.now());
197
+ this.figureOutStreamingStatus();
198
+ }
199
+ /**
200
+ * Changes streaming status.
201
+ * @param newStatus
202
+ */
203
+ _changeStreamingStatus(newStatus) {
204
+ if (this.track.getTrackStreamingStatus() !== newStatus) {
205
+ const sourceName = this.track.getSourceName();
206
+ this.track._setTrackStreamingStatus(newStatus);
207
+ logger.debug(`Emit track streaming status(${Date.now()}) ${sourceName}: ${newStatus}`);
208
+ // It's common for the event listeners to access the JitsiRemoteTrack. Thus pass it as a parameter here.
209
+ this.track.emit(JitsiTrackEvents.TRACK_STREAMING_STATUS_CHANGED, this.track, newStatus);
210
+ if (newStatus === TrackStreamingStatus.INACTIVE) {
211
+ RTCStats.sendStatsEntry(RTCStatsEvents.REMOTE_SOURCE_SUSPENDED_EVENT);
212
+ }
213
+ else if (newStatus === TrackStreamingStatus.INTERRUPTED) {
214
+ RTCStats.sendStatsEntry(RTCStatsEvents.REMOTE_SOURCE_INTERRUPTED_EVENT);
215
+ }
216
+ }
217
+ }
218
+ /**
219
+ * Reset the postponed "streaming interrupted" event which was previously scheduled as a timeout on RTC 'onmute'
220
+ * event.
221
+ */
222
+ clearTimeout() {
223
+ if (this.trackTimer) {
224
+ window.clearTimeout(this.trackTimer);
225
+ this.trackTimer = null;
226
+ }
227
+ }
228
+ /**
229
+ * Clears the timestamp of the RTC muted event for remote video track.
230
+ */
231
+ clearRtcMutedTimestamp() {
232
+ this.rtcMutedTimestamp = null;
233
+ }
234
+ /**
235
+ * Checks if track is considered frozen.
236
+ * @return <tt>true</tt> if the video has frozen or <tt>false</tt> when it's either not considered frozen
237
+ * (yet) or if freeze detection is not supported by the current browser.
238
+ *
239
+ * FIXME merge this logic with NO_DATA_FROM_SOURCE event implemented in JitsiLocalTrack by extending the event to
240
+ * the remote track and allowing to set different timeout for local and remote tracks.
241
+ */
242
+ isVideoTrackFrozen() {
243
+ if (!browser.supportsVideoMuteOnConnInterrupted()) {
244
+ return false;
245
+ }
246
+ const isVideoRTCMuted = this.track.isWebRTCTrackMuted();
247
+ const rtcMutedTimestamp = this.rtcMutedTimestamp;
248
+ const timeout = this._getVideoFrozenTimeout();
249
+ return isVideoRTCMuted && typeof rtcMutedTimestamp === 'number' && (Date.now() - rtcMutedTimestamp) >= timeout;
250
+ }
251
+ /**
252
+ * Figures out (and updates) the current streaming status for the track identified by the source name.
253
+ */
254
+ figureOutStreamingStatus() {
255
+ const sourceName = this.track.getSourceName();
256
+ const inP2PMode = this.conference.isP2PActive();
257
+ const isRestoringTimedOut = this._isRestoringTimedout();
258
+ const audioOnlyMode = this.conference.getLastN() === 0;
259
+ // NOTE Overriding videoMuted to true for audioOnlyMode should disable any detection based on video playback or
260
+ // forwarded sources.
261
+ const isVideoMuted = this.track.isMuted() || audioOnlyMode;
262
+ const isVideoTrackFrozen = this.isVideoTrackFrozen();
263
+ const isInForwardedSources = this.rtc.isInForwardedSources(sourceName);
264
+ const newState = inP2PMode
265
+ ? TrackStreamingStatusImpl._getNewStateForP2PMode(isVideoMuted, isVideoTrackFrozen)
266
+ : TrackStreamingStatusImpl._getNewStateForJvbMode(isInForwardedSources, isRestoringTimedOut, isVideoMuted, isVideoTrackFrozen);
267
+ // if the new state is not restoring clear timers and timestamps that we use to track the restoring state
268
+ if (newState !== TrackStreamingStatus.RESTORING) {
269
+ this._clearRestoringTimer();
270
+ }
271
+ logger.debug(`Figure out conn status for ${sourceName}, is video muted: ${isVideoMuted} video track frozen: ${isVideoTrackFrozen} p2p mode: ${inP2PMode} is in forwarded sources: ${isInForwardedSources} currentStatus => newStatus: ${this.track.getTrackStreamingStatus()} => ${newState}`);
272
+ const oldStreamingStatus = this.streamingStatusMap || {};
273
+ // Send an analytics event (guard on either the p2p flag or the streaming status has changed since the last
274
+ // time this code block run).
275
+ if (!('p2p' in oldStreamingStatus)
276
+ || !('streamingStatus' in oldStreamingStatus)
277
+ || oldStreamingStatus.p2p !== inP2PMode
278
+ || oldStreamingStatus.streamingStatus !== newState) {
279
+ const nowMs = Date.now();
280
+ this.maybeSendTrackStreamingStatusEvent(nowMs);
281
+ this.streamingStatusMap = {
282
+ ...oldStreamingStatus,
283
+ p2p: inP2PMode,
284
+ startedMs: nowMs,
285
+ streamingStatus: newState
286
+ };
287
+ // sometimes (always?) we're late to hook the TRACK_VIDEOTYPE_CHANGED event and the video type is not in
288
+ // oldStreamingStatus.
289
+ if (!('videoType' in this.streamingStatusMap)) {
290
+ this.streamingStatusMap.videoType = this.track.getVideoType();
291
+ }
292
+ }
293
+ this._changeStreamingStatus(newState);
294
+ }
295
+ /**
296
+ * Computes the duration of the current streaming status for the track (i.e. 15 seconds in the INTERRUPTED state)
297
+ * and sends a track streaming status event.
298
+ * @param nowMs - The current time (in millis).
299
+ */
300
+ maybeSendTrackStreamingStatusEvent(nowMs) {
301
+ const trackStreamingStatus = this.streamingStatusMap;
302
+ if (trackStreamingStatus
303
+ && 'startedMs' in trackStreamingStatus
304
+ && 'videoType' in trackStreamingStatus
305
+ && 'streamingStatus' in trackStreamingStatus
306
+ && 'p2p' in trackStreamingStatus) {
307
+ trackStreamingStatus.value = nowMs - trackStreamingStatus.startedMs;
308
+ Statistics.sendAnalytics(createTrackStreamingStatusEvent(trackStreamingStatus));
309
+ }
310
+ }
311
+ /**
312
+ * On change in forwarded sources set check all leaving and entering track to change their corresponding statuses.
313
+ *
314
+ * @param leavingForwardedSources - The array of sourceName leaving forwarded sources.
315
+ * @param enteringForwardedSources - The array of sourceName entering forwarded sources.
316
+ * @param timestamp - The time in millis
317
+ * @private
318
+ */
319
+ onForwardedSourcesChanged(leavingForwardedSources = [], enteringForwardedSources = [], timestamp) {
320
+ const sourceName = this.track.getSourceName();
321
+ // If the browser doesn't fire the mute/onmute events when the remote peer stops/starts sending media,
322
+ // calculate the streaming status for all the tracks since it won't get triggered automatically on the track
323
+ // that has started/stopped receiving media.
324
+ if (!browser.supportsVideoMuteOnConnInterrupted()) {
325
+ this.figureOutStreamingStatus();
326
+ }
327
+ if (leavingForwardedSources.includes(sourceName)) {
328
+ this.track._clearEnteredForwardedSourcesTimestamp();
329
+ this._clearRestoringTimer();
330
+ browser.supportsVideoMuteOnConnInterrupted() && this.figureOutStreamingStatus();
331
+ }
332
+ if (enteringForwardedSources.includes(sourceName)) {
333
+ // store the timestamp this track is entering forwarded sources
334
+ this.track._setEnteredForwardedSourcesTimestamp(timestamp);
335
+ browser.supportsVideoMuteOnConnInterrupted() && this.figureOutStreamingStatus();
336
+ }
337
+ }
338
+ /**
339
+ * Clears the restoring timer for video track and the timestamp for entering forwarded sources.
340
+ */
341
+ _clearRestoringTimer() {
342
+ const rTimer = this.restoringTimer;
343
+ if (rTimer) {
344
+ clearTimeout(rTimer);
345
+ this.restoringTimer = null;
346
+ }
347
+ }
348
+ /**
349
+ * Checks whether a track had stayed enough in restoring state, compares current time and the time the track
350
+ * entered in forwarded sources. If it hasn't timedout and there is no timer added, add new timer in order to give
351
+ * it more time to become active or mark it as interrupted on next check.
352
+ *
353
+ * @returns <tt>true</tt> if the track was in restoring state more than the timeout
354
+ * ({@link DEFAULT_RESTORING_TIMEOUT}.) in order to set its status to interrupted.
355
+ * @private
356
+ */
357
+ _isRestoringTimedout() {
358
+ const enteredForwardedSourcesTimestamp = this.track._getEnteredForwardedSourcesTimestamp();
359
+ if (enteredForwardedSourcesTimestamp
360
+ && (Date.now() - enteredForwardedSourcesTimestamp) >= DEFAULT_RESTORING_TIMEOUT) {
361
+ return true;
362
+ }
363
+ // still haven't reached timeout, if there is no timer scheduled, schedule one so we can track the restoring
364
+ // state and change it after reaching the timeout
365
+ const rTimer = this.restoringTimer;
366
+ if (!rTimer) {
367
+ this.restoringTimer = setTimeout(() => this.figureOutStreamingStatus(), DEFAULT_RESTORING_TIMEOUT);
368
+ }
369
+ return false;
370
+ }
371
+ /** Checks whether a track is the current track. */
372
+ _isCurrentTrack(track) {
373
+ return track.getSourceName() === this.track.getSourceName();
374
+ }
375
+ /**
376
+ * Sends a last/final track streaming status event for the track of the user that left the conference.
377
+ * @param id - The id of the participant that left the conference.
378
+ */
379
+ onUserLeft(id) {
380
+ if (this.track.getParticipantId() === id) {
381
+ this.maybeSendTrackStreamingStatusEvent(Date.now());
382
+ this.streamingStatusMap = {};
383
+ }
384
+ }
385
+ /**
386
+ * Handles RTC 'onmute' event for the video track.
387
+ *
388
+ * @param track - The video track for which 'onmute' event will be processed.
389
+ */
390
+ onTrackRtcMuted(track) {
391
+ if (!this._isCurrentTrack(track)) {
392
+ return;
393
+ }
394
+ const sourceName = track.getSourceName();
395
+ logger.debug(`Detector track RTC muted: ${sourceName}`, Date.now());
396
+ this.rtcMutedTimestamp = Date.now();
397
+ if (!track.isMuted()) {
398
+ // If the user is not muted according to the signalling we'll give it some time, before the streaming
399
+ // interrupted event is triggered.
400
+ this.clearTimeout();
401
+ // The timeout is reduced when track is not in the forwarded sources
402
+ const timeout = this._getVideoFrozenTimeout();
403
+ this.trackTimer = window.setTimeout(() => {
404
+ logger.debug(`Set track RTC muted for: ${sourceName} after the timeout of ${timeout} ms`);
405
+ this.clearTimeout();
406
+ this.figureOutStreamingStatus();
407
+ }, timeout);
408
+ }
409
+ }
410
+ /**
411
+ * Handles RTC 'onunmute' event for the video track.
412
+ *
413
+ * @param track - The video track for which 'onunmute' event will be processed.
414
+ */
415
+ onTrackRtcUnmuted(track) {
416
+ if (!this._isCurrentTrack(track)) {
417
+ return;
418
+ }
419
+ const sourceName = this.track.getSourceName();
420
+ logger.debug(`Detector track RTC unmuted: ${sourceName}`, Date.now());
421
+ this.clearTimeout();
422
+ this.clearRtcMutedTimestamp();
423
+ this.figureOutStreamingStatus();
424
+ }
425
+ /**
426
+ * Here the signalling "mute"/"unmute" events are processed.
427
+ *
428
+ * @param track - The remote video track for which the signalling mute/unmute event will be
429
+ * processed.
430
+ */
431
+ onSignallingMuteChanged(track) {
432
+ if (!this._isCurrentTrack(track)) {
433
+ return;
434
+ }
435
+ this.figureOutStreamingStatus();
436
+ }
437
+ /**
438
+ * Sends a track streaming status event as a result of the video type changing.
439
+ * @deprecated this will go away with full multiple streams support
440
+ * @param type - The video type.
441
+ */
442
+ onTrackVideoTypeChanged(type) {
443
+ const nowMs = Date.now();
444
+ this.maybeSendTrackStreamingStatusEvent(nowMs);
445
+ this.streamingStatusMap = {
446
+ ...this.streamingStatusMap || {},
447
+ startedMs: nowMs,
448
+ videoType: type
449
+ };
450
+ }
451
+ }
452
+ export default TrackStreamingStatusImpl;
453
+ //# sourceMappingURL=TrackStreamingStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrackStreamingStatus.js","sourceRoot":"","sources":["../../../../modules/connectivity/TrackStreamingStatus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { getLogger } from '@jitsi/logger';
2
+ import { JitsiTrackEvents } from '../../JitsiTrackEvents';
3
+ import RTC from '../RTC/RTC';
4
+ import Statistics from '../statistics/statistics';
5
+ const logger = getLogger('vad:ActiveDeviceDetector');
6
+ // If after 3000 ms the detector did not find any active devices consider that there aren't any usable ones available
7
+ // i.e. audioLevel > 0.008
8
+ const DETECTION_TIMEOUT = 3000;
9
+ /**
10
+ * Go through all audio devices on the system and return one that is active, i.e. has audio signal.
11
+ *
12
+ * @returns Promise<IActiveDeviceInfo> - Object containing information about the found device.
13
+ */
14
+ export default function getActiveAudioDevice() {
15
+ return new Promise(resolve => {
16
+ RTC.enumerateDevices((devices) => {
17
+ const audioDevices = devices.filter(device => device.kind === 'audioinput');
18
+ const devicePromiseArray = [];
19
+ for (const micDevice of audioDevices) {
20
+ const devicePromise = RTC.obtainAudioAndVideoPermissions({
21
+ devices: ['audio'],
22
+ micDeviceId: micDevice.deviceId
23
+ }).then((tracks) => {
24
+ // We expect a single device to be available when obtained from obtainAudioAndVideoPermissions
25
+ // that's why only take p.value[0].
26
+ const track = tracks[0];
27
+ Statistics.startLocalStats(track, track.setAudioLevel.bind(track));
28
+ return track;
29
+ });
30
+ devicePromiseArray.push(devicePromise);
31
+ }
32
+ Promise.allSettled(devicePromiseArray).then(outcomeArray => {
33
+ const successfulPromises = outcomeArray.filter(p => p.status === 'fulfilled');
34
+ const rejectedPromises = outcomeArray.filter(p => p.status === 'rejected');
35
+ const availableDevices = successfulPromises.map(p => p.value);
36
+ const rejectReasons = rejectedPromises.map(p => p.value);
37
+ for (const reason of rejectReasons) {
38
+ logger.error('Failed to acquire audio device with error: ', reason);
39
+ }
40
+ // Setup event handlers for monitored devices.
41
+ for (const device of availableDevices) {
42
+ device.on(JitsiTrackEvents.TRACK_AUDIO_LEVEL_CHANGED, audioLevel => {
43
+ // This is a very naive approach but works, a more accurate one would be to use rnnoise in
44
+ // order to limit the number of false positives. The 0.008 constant is due to how
45
+ // LocalStatsCollector from lib-jitsi-meet publishes audio-levels, in this case 0.008 denotes //
46
+ // no input.
47
+ if (audioLevel > 0.008) {
48
+ stopActiveDevices(availableDevices);
49
+ resolve({
50
+ deviceId: device.deviceId,
51
+ deviceLabel: device.getTrack().label
52
+ });
53
+ }
54
+ });
55
+ }
56
+ // Cancel the detection in case no devices was found with audioLevel > 0 in the set timeout.
57
+ setTimeout(() => {
58
+ stopActiveDevices(availableDevices);
59
+ resolve({
60
+ deviceId: '',
61
+ deviceLabel: ''
62
+ });
63
+ }, DETECTION_TIMEOUT);
64
+ });
65
+ });
66
+ });
67
+ }
68
+ /**
69
+ * Stop the streams of the provided JitsiLocalTracks.
70
+ *
71
+ * @param {Array<JitsiLocalTrack>} deviceList - Array of JitsiLocalTracks to stop.
72
+ * @returns {void}
73
+ */
74
+ function stopActiveDevices(deviceList) {
75
+ for (const device of deviceList) {
76
+ device.stopStream();
77
+ }
78
+ }
79
+ //# sourceMappingURL=ActiveDeviceDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActiveDeviceDetector.js","sourceRoot":"","sources":["../../../../modules/detection/ActiveDeviceDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ export var DetectionEvents;
2
+ (function (DetectionEvents) {
3
+ /** Event triggered by {@link NoAudioSignalDetector} when the local audio device associated with a JitsiConference
4
+ * starts receiving audio levels with the value of 0 meaning no audio is being captured on that device, or when
5
+ * it starts receiving audio levels !== 0 after being in a state of no audio.
6
+ * @event
7
+ * @type {boolean} - true when the current conference audio track has audio input false otherwise.
8
+ */
9
+ DetectionEvents["AUDIO_INPUT_STATE_CHANGE"] = "audio_input_state_changed";
10
+ /**
11
+ * Event triggered by a audio detector indicating that its active state has changed from active to inactive or vice
12
+ * versa.
13
+ * @event
14
+ * @type {boolean} - true when service has changed to active false otherwise.
15
+ */
16
+ DetectionEvents["DETECTOR_STATE_CHANGE"] = "detector_state_change";
17
+ /** Event triggered by NoAudioSignalDetector when the local audio device associated with a JitsiConference goes
18
+ * silent for a period of time, meaning that the device is either broken or hardware/software muted.
19
+ * @event
20
+ * @type {void}
21
+ */
22
+ DetectionEvents["NO_AUDIO_INPUT"] = "no_audio_input_detected";
23
+ /**
24
+ * Event generated by {@link VADNoiseDetection} when the tracked device is considered noisy.
25
+ * @event
26
+ * @type {Object}
27
+ */
28
+ DetectionEvents["VAD_NOISY_DEVICE"] = "detection.vad_noise_device";
29
+ /**
30
+ * Event generated by VADReportingService when if finishes creating a VAD report for the monitored devices.
31
+ * The generated objects are of type Array<Object>, one score for each monitored device.
32
+ * @event VAD_REPORT_PUBLISHED
33
+ * @type Array<Object> with the following structure:
34
+ * @property {Date} timestamp - Timestamp at which the compute took place.
35
+ * @property {number} avgVAD - Average VAD score over monitored period of time.
36
+ * @property {string} deviceId - Associate local audio device ID.
37
+ */
38
+ DetectionEvents["VAD_REPORT_PUBLISHED"] = "vad-report-published";
39
+ /**
40
+ * Event generated by {@link TrackVADEmitter} when PCM sample VAD score is available.
41
+ *
42
+ * @event
43
+ * @type {Object}
44
+ * @property {Date} timestamp - Exact time at which processed PCM sample was generated.
45
+ * @property {number} score - VAD score on a scale from 0 to 1 (i.e. 0.7)
46
+ * @property {Float32Array} pcmData - Raw PCM data with which the VAD score was calculated.
47
+ * @property {string} deviceId - Device id of the associated track.
48
+ */
49
+ DetectionEvents["VAD_SCORE_PUBLISHED"] = "detection.vad_score_published";
50
+ /**
51
+ * Event generated by {@link VADTalkMutedDetection} when a user is talking while the mic is muted.
52
+ *
53
+ * @event
54
+ * @type {Object}
55
+ */
56
+ DetectionEvents["VAD_TALK_WHILE_MUTED"] = "detection.vad_talk_while_muted";
57
+ })(DetectionEvents || (DetectionEvents = {}));
58
+ //# sourceMappingURL=DetectionEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetectionEvents.js","sourceRoot":"","sources":["../../../../modules/detection/DetectionEvents.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,eA8DX;AA9DD,WAAY,eAAe;IAEvB;;;;;OAKG;IACH,yEAAsD,CAAA;IAEtD;;;;;OAKG;IACH,kEAA+C,CAAA;IAE/C;;;;OAIG;IACH,6DAA0C,CAAA;IAE1C;;;;OAIG;IACH,kEAA+C,CAAA;IAE/C;;;;;;;;OAQG;IACH,gEAA6C,CAAA;IAE7C;;;;;;;;;OASG;IACH,wEAAqD,CAAA;IAErD;;;;;OAKG;IACH,0EAAuD,CAAA;AAC3D,CAAC,EA9DW,eAAe,KAAf,eAAe,QA8D1B"}