@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,257 @@
1
+ import { getLogger } from '@jitsi/logger';
2
+ import { XMPPEvents } from '../../service/xmpp/XMPPEvents';
3
+ import JibriSession from './JibriSession';
4
+ import { getFocusRecordingUpdate, getHiddenDomainUpdate, isFromFocus } from './recordingXMLUtils';
5
+ const logger = getLogger('recording:RecordingManager');
6
+ /**
7
+ * A class responsible for starting and stopping recording sessions and emitting
8
+ * state updates for them.
9
+ */
10
+ class RecordingManager {
11
+ /**
12
+ * Initialize {@code RecordingManager} with other objects that are necessary
13
+ * for starting a recording.
14
+ *
15
+ * @param {ChatRoom} chatRoom - The chat room to handle.
16
+ * @returns {void}
17
+ */
18
+ constructor(chatRoom) {
19
+ this._sessions = {};
20
+ /**
21
+ * All known recording sessions from the current conference.
22
+ */
23
+ this._chatRoom = chatRoom;
24
+ this.onPresence = this.onPresence.bind(this);
25
+ this.onMemberLeft = this.onMemberLeft.bind(this);
26
+ this._chatRoom.eventEmitter.addListener(XMPPEvents.PRESENCE_RECEIVED, this.onPresence);
27
+ this._chatRoom.eventEmitter.addListener(XMPPEvents.MUC_MEMBER_LEFT, this.onMemberLeft);
28
+ }
29
+ /**
30
+ * Finds an existing recording session by session ID.
31
+ *
32
+ * @param {string} sessionID - The session ID associated with the recording.
33
+ * @returns {Optional<JibriSession>}
34
+ */
35
+ getSession(sessionID) {
36
+ return this._sessions[sessionID];
37
+ }
38
+ /**
39
+ * Find a session with a specific jibri JID.
40
+ *
41
+ * @param {string} jibriJid the JID to search for.
42
+ * @returns
43
+ */
44
+ getSessionByJibriJid(jibriJid) {
45
+ let s;
46
+ Object.values(this._sessions).forEach(session => {
47
+ if (session.getJibriJid() === jibriJid) {
48
+ s = session;
49
+ }
50
+ });
51
+ return s;
52
+ }
53
+ /**
54
+ * Callback to invoke to parse through a presence update to find recording
55
+ * related updates (from Jibri participant doing the recording and the
56
+ * focus which controls recording).
57
+ *
58
+ * @param {Object} event - The presence data from the pubsub event.
59
+ * @param {Element} event.presence - An XMPP presence update.
60
+ * @param {boolean} event.fromHiddenDomain - Whether or not the update comes
61
+ * from a participant that is trusted but not visible, as would be the case
62
+ * with the Jibri recorder participant.
63
+ * @returns {void}
64
+ */
65
+ onPresence({ fromHiddenDomain, presence }) {
66
+ if (isFromFocus(presence)) {
67
+ this._handleFocusPresence(presence);
68
+ }
69
+ else if (fromHiddenDomain) {
70
+ this._handleJibriPresence(presence);
71
+ }
72
+ }
73
+ /**
74
+ * Handle a participant leaving the room.
75
+ * @param {string} jid the JID of the participant that left.
76
+ */
77
+ onMemberLeft(jid) {
78
+ const session = this.getSessionByJibriJid(jid);
79
+ if (session) {
80
+ const prevStatus = session.getStatus();
81
+ // Setting to ''
82
+ session.setStatus('');
83
+ session.setJibriJid(null);
84
+ if (session.getStatus() !== prevStatus) {
85
+ this._emitSessionUpdate(session);
86
+ }
87
+ }
88
+ }
89
+ /**
90
+ * Start a recording session.
91
+ *
92
+ * @param {Object} options - Configuration for the recording.
93
+ * @param {string} [options.appData] - Data specific to the app/service that
94
+ * the result file will be uploaded.
95
+ * @param {string} [optional] options.broadcastId - The channel on which a
96
+ * live stream will occur.
97
+ * @param {string} options.mode - The mode in which recording should be
98
+ * started. Recognized values are "file" and "stream".
99
+ * @param {string} [optional] options.streamId - The stream key to be used
100
+ * for live stream broadcasting. Required for live streaming.
101
+ * @returns {Promise} A promise for starting a recording, which will pass
102
+ * back the session on success. The promise resolves after receiving an
103
+ * acknowledgment of the start request success or fail.
104
+ */
105
+ startRecording(options) {
106
+ const session = new JibriSession({
107
+ ...options,
108
+ connection: this._chatRoom.connection
109
+ });
110
+ return session.start({
111
+ appData: options.appData,
112
+ broadcastId: options.broadcastId,
113
+ focusMucJid: this._chatRoom.focusMucJid,
114
+ streamId: options.streamId
115
+ })
116
+ .then(() => {
117
+ // Only store the session and emit if the session has not been
118
+ // added already. This is a workaround for the session getting
119
+ // created due to a presence update to announce a "pending"
120
+ // recording being received before JibriSession#start finishes.
121
+ if (!this.getSession(session.getID())) {
122
+ this._addSession(session);
123
+ this._emitSessionUpdate(session);
124
+ }
125
+ return session;
126
+ })
127
+ .catch(error => {
128
+ this._emitSessionUpdate(session);
129
+ return Promise.reject(error);
130
+ });
131
+ }
132
+ /**
133
+ * Stop a recording session.
134
+ *
135
+ * @param {string} sessionID - The ID associated with the recording session
136
+ * to be stopped.
137
+ * @returns {Promise} The promise resolves after receiving an
138
+ * acknowledgment of the stop request success or fail.
139
+ */
140
+ stopRecording(sessionID) {
141
+ const session = this.getSession(sessionID);
142
+ if (session) {
143
+ return session.stop({ focusMucJid: this._chatRoom.focusMucJid });
144
+ }
145
+ return Promise.reject(new Error('Could not find session'));
146
+ }
147
+ /**
148
+ * Stores a reference to the passed in JibriSession.
149
+ *
150
+ * @param {string} session - The JibriSession instance to store.
151
+ * @returns {void}
152
+ */
153
+ _addSession(session) {
154
+ this._sessions[session.getID()] = session;
155
+ }
156
+ /**
157
+ * Create a new instance of a recording session and stores a reference to
158
+ * it.
159
+ *
160
+ * @param {string} sessionID - The session ID of the recording in progress.
161
+ * @param {string} status - The current status of the recording session.
162
+ * @param {string} mode - The recording mode of the session.
163
+ * @returns {JibriSession}
164
+ */
165
+ _createSession(sessionID, status, mode) {
166
+ const session = new JibriSession({
167
+ connection: this._chatRoom.connection,
168
+ focusMucJid: this._chatRoom.focusMucJid,
169
+ mode,
170
+ sessionID,
171
+ status
172
+ });
173
+ this._addSession(session);
174
+ return session;
175
+ }
176
+ /**
177
+ * Notifies listeners of an update to a recording session.
178
+ *
179
+ * @param {JibriSession} session - The session that has been updated.
180
+ * @param {string|undefined} initiator - The jid of the initiator of the update.
181
+ */
182
+ _emitSessionUpdate(session, initiator) {
183
+ this._chatRoom.eventEmitter.emit(XMPPEvents.RECORDER_STATE_CHANGED, session, initiator);
184
+ }
185
+ /**
186
+ * Parses presence to update an existing JibriSession or to create a new
187
+ * JibriSession.
188
+ *
189
+ * @param {Element} presence - An XMPP presence update.
190
+ * @returns {void}
191
+ */
192
+ _handleFocusPresence(presence) {
193
+ const jibriStatus = getFocusRecordingUpdate(presence);
194
+ if (!jibriStatus) {
195
+ return;
196
+ }
197
+ const { error, initiator, recordingMode, sessionID, status } = jibriStatus;
198
+ // We'll look for an existing session or create one (in case we're a
199
+ // participant joining a call with an existing recording going on).
200
+ let session = this.getSession(sessionID);
201
+ // Handle the case where a status update is received in presence but
202
+ // the local participant has joined while the JibriSession has already
203
+ // ended.
204
+ if (!session && status === 'off') {
205
+ logger.warn('Ignoring recording presence update', 'Received a new session with status off.');
206
+ return;
207
+ }
208
+ // Jicofo sends updates via presence, and any extension in presence
209
+ // is sent until it is explicitly removed. It's difficult for
210
+ // Jicofo to know when a presence has been sent once, so it won't
211
+ // remove jibri status extension. This means we may receive the same
212
+ // status update more than once, so check for that here
213
+ if (session
214
+ && session.getStatus() === status
215
+ && session.getError() === error) {
216
+ logger.warn('Ignoring duplicate presence update: ', JSON.stringify(jibriStatus));
217
+ return;
218
+ }
219
+ if (!session) {
220
+ session = this._createSession(sessionID, status, recordingMode);
221
+ }
222
+ session.setStatusFromJicofo(status);
223
+ if (this._chatRoom.role === 'visitor') {
224
+ // visitors will not receive presence updates from jibri, so we handle their status here
225
+ session.setStatus(status);
226
+ }
227
+ if (error) {
228
+ session.setError(error);
229
+ }
230
+ this._emitSessionUpdate(session, initiator);
231
+ }
232
+ /**
233
+ * Handles updates from the Jibri which can broadcast a YouTube URL that
234
+ * needs to be updated in a JibriSession.
235
+ *
236
+ * @param {Element} presence - An XMPP presence update.
237
+ * @returns {void}
238
+ */
239
+ _handleJibriPresence(presence) {
240
+ const { liveStreamViewURL, mode, sessionID } = getHiddenDomainUpdate(presence);
241
+ if (!sessionID) {
242
+ logger.warn('Ignoring potential jibri presence due to no session id.');
243
+ return;
244
+ }
245
+ let session = this.getSession(sessionID);
246
+ if (!session) {
247
+ session = this._createSession(sessionID, 'on', mode);
248
+ }
249
+ // When a jibri is present the status is always 'on';
250
+ session.setStatus('on');
251
+ session.setJibriJid(presence.getAttribute('from'));
252
+ session.setLiveStreamViewURL(liveStreamViewURL);
253
+ this._emitSessionUpdate(session);
254
+ }
255
+ }
256
+ export default RecordingManager;
257
+ //# sourceMappingURL=RecordingManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordingManager.js","sourceRoot":"","sources":["../../../../modules/recording/RecordingManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ const recordingConstants = {
2
+ error: {
3
+ BUSY: 'busy',
4
+ ERROR: 'error',
5
+ POLICY_VIOLATION: 'policy-violation',
6
+ RESOURCE_CONSTRAINT: 'resource-constraint',
7
+ SERVICE_UNAVAILABLE: 'service-unavailable',
8
+ UNEXPECTED_REQUEST: 'unexpected-request'
9
+ },
10
+ mode: {
11
+ FILE: 'file',
12
+ STREAM: 'stream'
13
+ },
14
+ status: {
15
+ OFF: 'off',
16
+ ON: 'on',
17
+ PENDING: 'pending'
18
+ }
19
+ };
20
+ export default recordingConstants;
21
+ //# sourceMappingURL=recordingConstants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recordingConstants.js","sourceRoot":"","sources":["../../../../modules/recording/recordingConstants.ts"],"names":[],"mappings":"AAoBA,MAAM,kBAAkB,GAAwB;IAC5C,KAAK,EAAE;QACH,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,OAAO;QACd,gBAAgB,EAAE,kBAAkB;QACpC,mBAAmB,EAAE,qBAAqB;QAC1C,mBAAmB,EAAE,qBAAqB;QAC1C,kBAAkB,EAAE,oBAAoB;KAC3C;IACD,IAAI,EAAE;QACF,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,QAAQ;KACnB;IACD,MAAM,EAAE;QACJ,GAAG,EAAE,KAAK;QACV,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,SAAS;KACrB;CACJ,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * A collection of utility functions for taking in XML and parsing it to return
3
+ * certain values.
4
+ */
5
+ /**
6
+ * Parses the presence update of the focus and returns an object with the
7
+ * statuses related to recording.
8
+ *
9
+ * @param {Element} presence - An XMPP presence update.
10
+ * @returns {Optional<Object>} The current presence values related to recording.
11
+ */
12
+ export function getFocusRecordingUpdate(presence) {
13
+ const jibriStatus = presence?.getElementsByTagName('jibri-recording-status')[0];
14
+ if (!jibriStatus) {
15
+ return;
16
+ }
17
+ return {
18
+ error: jibriStatus.getAttribute('failure_reason'),
19
+ initiator: jibriStatus.getAttribute('initiator'),
20
+ recordingMode: jibriStatus.getAttribute('recording_mode'),
21
+ sessionID: jibriStatus.getAttribute('session_id'),
22
+ status: jibriStatus.getAttribute('status')
23
+ };
24
+ }
25
+ /**
26
+ * Parses the presence update from a hidden domain participant and returns
27
+ * an object with the statuses related to recording.
28
+ *
29
+ * @param {Element} presence - An XMPP presence update.
30
+ * @returns {Object} The current presence values related to recording.
31
+ */
32
+ export function getHiddenDomainUpdate(presence) {
33
+ const liveStreamViewURL = presence.getElementsByTagName('live-stream-view-url')[0]?.textContent;
34
+ const mode = presence.getElementsByTagName('mode')[0]?.textContent?.toLowerCase();
35
+ const sessionID = presence.getElementsByTagName('session_id')[0]?.textContent;
36
+ return {
37
+ liveStreamViewURL,
38
+ mode,
39
+ sessionID
40
+ };
41
+ }
42
+ /**
43
+ * Returns the recording session ID from a successful IQ.
44
+ *
45
+ * @param {Element} response - The response from the IQ.
46
+ * @returns {string} The session ID of the recording session.
47
+ */
48
+ export function getSessionIdFromIq(response) {
49
+ return response?.getElementsByTagName('jibri')[0]?.getAttribute('session_id') ?? null;
50
+ }
51
+ /**
52
+ * Returns the recording session ID from a presence, if it exists.
53
+ *
54
+ * @param {Element} presence - An XMPP presence update.
55
+ * @returns {string|null|undefined} The session ID of the recording session.
56
+ */
57
+ export function getSessionId(presence) {
58
+ return presence.getElementsByTagName('session_id')[0]?.textContent;
59
+ }
60
+ /**
61
+ * Returns whether or not a presence is from the focus.
62
+ *
63
+ * @param {Element} presence - An XMPP presence update.
64
+ * @returns {boolean} True if the presence is from the focus.
65
+ */
66
+ export function isFromFocus(presence) {
67
+ return presence.getAttribute('from')?.includes('focus') ?? false;
68
+ }
69
+ //# sourceMappingURL=recordingXMLUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recordingXMLUtils.js","sourceRoot":"","sources":["../../../../modules/recording/recordingXMLUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAiB;IACrD,MAAM,WAAW,GAAG,QAAQ,EAAE,oBAAoB,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhF,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,OAAO;IACX,CAAC;IAED,OAAO;QACH,KAAK,EAAE,WAAW,CAAC,YAAY,CAAC,gBAAgB,CAAC;QACjD,SAAS,EAAE,WAAW,CAAC,YAAY,CAAC,WAAW,CAAC;QAChD,aAAa,EAAE,WAAW,CAAC,YAAY,CAAC,gBAAgB,CAAC;QACzD,SAAS,EAAE,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC;QACjD,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC;KAC7C,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAiB;IACnD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC;IAChG,MAAM,IAAI,GAAG,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IAClF,MAAM,SAAS,GAAG,QAAQ,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC;IAE9E,OAAO;QACH,iBAAiB;QACjB,IAAI;QACJ,SAAS;KACZ,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAiB;IAChD,OAAO,QAAQ,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;AAC1F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,QAAiB;IAC1C,OAAO,QAAQ,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC;AACvE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,QAAiB;IACzC,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;AACrE,CAAC"}
@@ -0,0 +1,108 @@
1
+ const MAX_TIMESTAMP = 0x100000000;
2
+ /**
3
+ * An encoder for RFC 2198 redundancy using WebRTC Insertable Streams.
4
+ */
5
+ export class RFC2198Encoder {
6
+ /**
7
+ * @param {number} targetRedundancy the desired amount of redundancy.
8
+ */
9
+ constructor(targetRedundancy = 1) {
10
+ this.targetRedundancy = targetRedundancy;
11
+ this.frameBuffer = new Array(targetRedundancy);
12
+ this.payloadType = undefined;
13
+ }
14
+ /**
15
+ * Set the desired level of redudancy. 4 means "four redundant frames plus current frame.
16
+ * It is possible to reduce this to 0 to minimize the overhead to one byte.
17
+ * @param {number} targetRedundancy the desired amount of redundancy.
18
+ */
19
+ setRedundancy(targetRedundancy) {
20
+ const currentBuffer = this.frameBuffer;
21
+ if (targetRedundancy > this.targetRedundancy) {
22
+ this.frameBuffer = new Array(targetRedundancy);
23
+ for (let i = 0; i < currentBuffer.length; i++) {
24
+ this.frameBuffer[i + targetRedundancy - this.targetRedundancy] = currentBuffer[i];
25
+ }
26
+ }
27
+ else if (targetRedundancy < this.targetRedundancy) {
28
+ this.frameBuffer = new Array(targetRedundancy);
29
+ for (let i = 0; i < this.frameBuffer.length; i++) {
30
+ this.frameBuffer[i] = currentBuffer[i + this.targetRedundancy - targetRedundancy];
31
+ }
32
+ }
33
+ this.targetRedundancy = targetRedundancy;
34
+ }
35
+ /**
36
+ * Set the "inner opus payload type". This is typically our RED payload type that we tell
37
+ * the other side as our opus payload type. Can be queried from the sender using getParameters()
38
+ * after setting the answer.
39
+ * @param {number} payloadType the payload type to use for opus.
40
+ */
41
+ setPayloadType(payloadType) {
42
+ this.payloadType = payloadType;
43
+ }
44
+ /**
45
+ * This is the actual transform to add redundancy to a raw opus frame.
46
+ * @param {RTCEncodedAudioFrame} encodedFrame - Encoded audio frame.
47
+ * @param {TransformStreamDefaultController} controller - TransportStreamController.
48
+ */
49
+ addRedundancy(encodedFrame, controller) {
50
+ // TODO: should this ensure encodedFrame.type being not set and
51
+ // encodedFrame.getMetadata().payloadType being the same as before?
52
+ /*
53
+ * From https://datatracker.ietf.org/doc/html/rfc2198#section-3:
54
+ 0 1 2 3
55
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
56
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
57
+ |F| block PT | timestamp offset | block length |
58
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59
+ 0 1 2 3 4 5 6 7
60
+ +-+-+-+-+-+-+-+-+
61
+ |0| Block PT |
62
+ +-+-+-+-+-+-+-+-+
63
+ */
64
+ const data = new Uint8Array(encodedFrame.data);
65
+ const newFrame = data.slice(0);
66
+ newFrame.timestamp = encodedFrame.timestamp;
67
+ let allFrames = this.frameBuffer.filter(x => Boolean(x)).concat(newFrame);
68
+ // TODO: determine how much we can fit into the available size (which we need to assume as 1190 bytes or so)
69
+ let needLength = 1 + newFrame.length;
70
+ for (let i = allFrames.length - 2; i >= 0; i--) {
71
+ const frame = allFrames[i];
72
+ // TODO: timestamp wraparound?
73
+ if ((allFrames[i + 1].timestamp - frame.timestamp + MAX_TIMESTAMP) % MAX_TIMESTAMP >= 16384) {
74
+ allFrames = allFrames.slice(i + 1);
75
+ break;
76
+ }
77
+ needLength += 4 + frame.length;
78
+ }
79
+ const newData = new Uint8Array(needLength);
80
+ const newView = new DataView(newData.buffer);
81
+ // Construct the header.
82
+ let frameOffset = 0;
83
+ for (let i = 0; i < allFrames.length - 1; i++) {
84
+ const frame = allFrames[i];
85
+ // Ensure correct behaviour on wraparound.
86
+ const tOffset = (encodedFrame.timestamp - frame.timestamp + MAX_TIMESTAMP) % MAX_TIMESTAMP;
87
+ // eslint-disable-next-line no-bitwise
88
+ newView.setUint8(frameOffset, (this.payloadType & 0x7f) | 0x80);
89
+ // eslint-disable-next-line no-bitwise
90
+ newView.setUint16(frameOffset + 1, (tOffset << 2) ^ (frame.byteLength >> 8));
91
+ newView.setUint8(frameOffset + 3, frame.byteLength & 0xff); // eslint-disable-line no-bitwise
92
+ frameOffset += 4;
93
+ }
94
+ // Last block header.
95
+ newView.setUint8(frameOffset++, this.payloadType);
96
+ // Construct the frame.
97
+ for (let i = 0; i < allFrames.length; i++) {
98
+ const frame = allFrames[i];
99
+ newData.set(frame, frameOffset);
100
+ frameOffset += frame.byteLength;
101
+ }
102
+ encodedFrame.data = newData.buffer;
103
+ this.frameBuffer.shift();
104
+ this.frameBuffer.push(newFrame);
105
+ controller.enqueue(encodedFrame);
106
+ }
107
+ }
108
+ //# sourceMappingURL=red.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"red.js","sourceRoot":"","sources":["../../../../modules/red/red.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ import { isEqual } from 'lodash-es';
2
+ import { MediaDirection } from '../../service/RTC/MediaDirection';
3
+ import { MediaType } from '../../service/RTC/MediaType';
4
+ import browser from '../browser';
5
+ import { SdpTransformWrap } from './SdpTransformUtil';
6
+ /**
7
+ * Fakes local SDP exposed to {@link JingleSessionPC} through the local description getter. Modifies the SDP, so that
8
+ * the stream identifiers are unique across all of the local PeerConnections and that the source names and video types
9
+ * are injected so that Jicofo can use them to identify the sources.
10
+ */
11
+ export default class LocalSdpMunger {
12
+ /**
13
+ * Creates new <tt>LocalSdpMunger</tt> instance.
14
+ *
15
+ * @param {TraceablePeerConnection} tpc
16
+ * @param {string} localEndpointId - The endpoint id of the local user.
17
+ */
18
+ constructor(tpc, localEndpointId) {
19
+ this._tpc = tpc;
20
+ this._localEndpointId = localEndpointId;
21
+ }
22
+ /**
23
+ * Updates or adds a 'msid' attribute for the local sources in the SDP. Also adds 'sourceName' and 'videoType'
24
+ * (if applicable) attributes. All other source attributes like 'cname', 'label' and 'mslabel' are removed since
25
+ * these are not processed by Jicofo.
26
+ *
27
+ * @param {MLineWrap} mediaSection - The media part (audio or video) of the session description which will be
28
+ * modified in place.
29
+ * @returns {void}
30
+ * @private
31
+ */
32
+ _transformMediaIdentifiers(mediaSection, ssrcMap) {
33
+ const mediaType = mediaSection._mLine.type;
34
+ const mediaDirection = mediaSection._mLine.direction;
35
+ const sources = [...new Set(mediaSection._mLine.ssrcs?.map(s => s.id))];
36
+ let trackId = mediaSection._mLine.msid?.split(' ')[1];
37
+ let sourceName;
38
+ if (ssrcMap.size) {
39
+ const sortedSources = sources.slice().sort();
40
+ for (const [id, trackSsrcs] of ssrcMap.entries()) {
41
+ if (isEqual(sortedSources, [...trackSsrcs.ssrcs].sort())) {
42
+ sourceName = id;
43
+ }
44
+ }
45
+ for (const source of sources) {
46
+ if ((mediaDirection === MediaDirection.SENDONLY || mediaDirection === MediaDirection.SENDRECV)
47
+ && sourceName) {
48
+ const msid = mediaSection.ssrcs.find(ssrc => ssrc.id === source && ssrc.attribute === 'msid');
49
+ if (msid) {
50
+ trackId = msid.value.split(' ')[1];
51
+ }
52
+ const generatedMsid = `${ssrcMap.get(sourceName).msid}-${this._tpc.id} ${trackId}-${this._tpc.id}`;
53
+ const existingMsid = mediaSection.ssrcs
54
+ .find(ssrc => ssrc.id === source && ssrc.attribute === 'msid');
55
+ // Always overwrite msid since we want the msid to be in this format even if the browser generates
56
+ // one. '<endpoint_id>-<mediaType>-<trackIndex>-<tpcId>' example - d8ff91-video-0-1
57
+ if (existingMsid) {
58
+ existingMsid.value = generatedMsid;
59
+ }
60
+ else {
61
+ mediaSection.ssrcs.push({
62
+ attribute: 'msid',
63
+ id: source,
64
+ value: generatedMsid
65
+ });
66
+ }
67
+ // Inject source names as a=ssrc:3124985624 name:endpointA-v0
68
+ mediaSection.ssrcs.push({
69
+ attribute: 'name',
70
+ id: source,
71
+ value: sourceName
72
+ });
73
+ const videoType = this._tpc.getLocalVideoTracks()
74
+ .find(track => track.getSourceName() === sourceName)
75
+ ?.getVideoType();
76
+ if (mediaType === MediaType.VIDEO && videoType) {
77
+ // Inject videoType as a=ssrc:1234 videoType:desktop.
78
+ mediaSection.ssrcs.push({
79
+ attribute: 'videoType',
80
+ id: source,
81
+ value: videoType
82
+ });
83
+ }
84
+ }
85
+ }
86
+ }
87
+ // Ignore the 'label' and 'mslabel' attributes.
88
+ mediaSection.ssrcs
89
+ = mediaSection.ssrcs.filter(ssrc => ssrc.attribute !== 'label' && ssrc.attribute !== 'mslabel');
90
+ // Remove the 'cname' attribute on Firefox as a=ssrc line with only 'cname' attribute are present in the SDP
91
+ // for recvonly SSRCs generated by createAnswer. These do not have to be signaled to the peers.
92
+ if (browser.isFirefox()) {
93
+ mediaSection.ssrcs = mediaSection.ssrcs.filter(ssrc => ssrc.attribute !== 'cname');
94
+ }
95
+ // On FF when the user has started muted create answer will generate a recv only SSRC. We don't want to signal
96
+ // this SSRC in order to reduce the load of the xmpp server for large calls. Therefore the SSRC needs to be
97
+ // removed from the SDP.
98
+ //
99
+ // For all other use cases (when the user has had media but then the user has stopped it) we want to keep the
100
+ // receive only SSRCs in the SDP. Otherwise source-remove will be triggered and the next time the user add a
101
+ // track we will reuse the SSRCs and send source-add with the same SSRCs. This is problematic because of issues
102
+ // on Chrome and FF (https://bugzilla.mozilla.org/show_bug.cgi?id=1768729) when removing and then adding the
103
+ // same SSRC in the remote sdp the remote track is not rendered.
104
+ if (browser.isFirefox()
105
+ && (mediaDirection === MediaDirection.RECVONLY || mediaDirection === MediaDirection.INACTIVE)
106
+ && ((mediaType === MediaType.VIDEO && !this._tpc._hasHadVideoTrack)
107
+ || (mediaType === MediaType.AUDIO && !this._tpc._hasHadAudioTrack))) {
108
+ mediaSection.ssrcs = undefined;
109
+ mediaSection.ssrcGroups = undefined;
110
+ }
111
+ }
112
+ /**
113
+ * This transformation will make sure that stream identifiers are unique across all of the local PeerConnections
114
+ * even if the same stream is used by multiple instances at the same time. It also injects 'sourceName' and
115
+ * 'videoType' attribute.
116
+ *
117
+ * @param {RTCSessionDescription} sessionDesc - The local session description (this instance remains unchanged).
118
+ * @param {Map<string, TPCSSRCInfo>} ssrcMap - The SSRC and source map for the local tracks.
119
+ * @return {RTCSessionDescription} - Transformed local session description
120
+ * (a modified copy of the one given as the input).
121
+ */
122
+ transformStreamIdentifiers(sessionDesc, ssrcMap) {
123
+ if (!sessionDesc?.sdp || !sessionDesc.type) {
124
+ return sessionDesc;
125
+ }
126
+ const transformer = new SdpTransformWrap(sessionDesc.sdp);
127
+ const audioMLine = transformer.selectMedia(MediaType.AUDIO)?.[0];
128
+ if (audioMLine) {
129
+ this._transformMediaIdentifiers(audioMLine, ssrcMap);
130
+ }
131
+ const videoMlines = transformer.selectMedia(MediaType.VIDEO);
132
+ if (videoMlines && Array.isArray(videoMlines)) {
133
+ for (const videoMLine of videoMlines) {
134
+ this._transformMediaIdentifiers(videoMLine, ssrcMap);
135
+ }
136
+ }
137
+ return {
138
+ sdp: transformer.toRawSDP(),
139
+ type: sessionDesc.type
140
+ };
141
+ }
142
+ }
143
+ //# sourceMappingURL=LocalSdpMunger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalSdpMunger.js","sourceRoot":"","sources":["../../../../modules/sdp/LocalSdpMunger.ts"],"names":[],"mappings":"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"}