@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,274 @@
1
+ /* eslint-disable no-bitwise */
2
+ import { deriveKeys, importKey, ratchet } from './crypto-utils';
3
+ // We use a ringbuffer of keys so we can change them and still decode packets that were
4
+ // encrypted with an old key. We use a size of 16 which corresponds to the four bits
5
+ // in the frame trailer.
6
+ const KEYRING_SIZE = 16;
7
+ // We copy the first bytes of the VP8 payload unencrypted.
8
+ // For keyframes this is 10 bytes, for non-keyframes (delta) 3. See
9
+ // https://tools.ietf.org/html/rfc6386#section-9.1
10
+ // This allows the bridge to continue detecting keyframes (only one byte needed in the JVB)
11
+ // and is also a bit easier for the VP8 decoder (i.e. it generates funny garbage pictures
12
+ // instead of being unable to decode).
13
+ // This is a bit for show and we might want to reduce to 1 unconditionally in the final version.
14
+ //
15
+ // For audio (where frame.type is not set) we do not encrypt the opus TOC byte:
16
+ // https://tools.ietf.org/html/rfc6716#section-3.1
17
+ const UNENCRYPTED_BYTES = {
18
+ delta: 3,
19
+ key: 10,
20
+ undefined: 1 // frame.type is not set on audio
21
+ };
22
+ const ENCRYPTION_ALGORITHM = 'AES-GCM';
23
+ /* We use a 96 bit IV for AES GCM. This is signalled in plain together with the
24
+ packet. See https://developer.mozilla.org/en-US/docs/Web/API/AesGcmParams */
25
+ const IV_LENGTH = 12;
26
+ const RATCHET_WINDOW_SIZE = 8;
27
+ /**
28
+ * Per-participant context holding the cryptographic keys and
29
+ * encode/decode functions
30
+ */
31
+ export class Context {
32
+ /**
33
+ * @param {Object} options
34
+ */
35
+ constructor({ sharedKey = false } = {}) {
36
+ // An array (ring) of keys that we use for sending and receiving.
37
+ this._cryptoKeyRing = new Array(KEYRING_SIZE);
38
+ // A pointer to the currently used key.
39
+ this._currentKeyIndex = -1;
40
+ this._sendCounts = new Map();
41
+ this._sharedKey = sharedKey;
42
+ this._enabled = false;
43
+ }
44
+ /**
45
+ * Function that will decrypt the given encoded frame. If the decryption fails, it will
46
+ * ratchet the key for up to RATCHET_WINDOW_SIZE times.
47
+ *
48
+ * @param {RTCEncodedVideoFrame|RTCEncodedAudioFrame} encodedFrame - Encoded video frame.
49
+ * @param {number} keyIndex - the index of the decryption data in _cryptoKeyRing array.
50
+ * @param {number} ratchetCount - the number of retries after ratcheting the key.
51
+ * @returns {Promise<RTCEncodedVideoFrame|RTCEncodedAudioFrame>} - The decrypted frame.
52
+ * @private
53
+ */
54
+ async _decryptFrame(encodedFrame, keyIndex, initialKey = undefined, ratchetCount = 0) {
55
+ const keyData = this._cryptoKeyRing[keyIndex];
56
+ const { encryptionKey } = keyData;
57
+ let { material } = keyData;
58
+ // Construct frame trailer. Similar to the frame header described in
59
+ // https://tools.ietf.org/html/draft-omara-sframe-00#section-4.2
60
+ // but we put it at the end.
61
+ //
62
+ // ---------+-------------------------+-+---------+----
63
+ // payload |IV...(length = IV_LENGTH)|R|IV_LENGTH|KID |
64
+ // ---------+-------------------------+-+---------+----
65
+ try {
66
+ const frameHeader = new Uint8Array(encodedFrame.data, 0, UNENCRYPTED_BYTES[encodedFrame.type]);
67
+ const frameTrailer = new Uint8Array(encodedFrame.data, encodedFrame.data.byteLength - 2, 2);
68
+ const ivLength = frameTrailer[0];
69
+ const iv = new Uint8Array(encodedFrame.data, encodedFrame.data.byteLength - ivLength - frameTrailer.byteLength, ivLength);
70
+ const cipherTextStart = frameHeader.byteLength;
71
+ const cipherTextLength = encodedFrame.data.byteLength
72
+ - (frameHeader.byteLength + ivLength + frameTrailer.byteLength);
73
+ const plainText = await crypto.subtle.decrypt({
74
+ additionalData: new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength),
75
+ iv,
76
+ name: 'AES-GCM'
77
+ }, encryptionKey, new Uint8Array(encodedFrame.data, cipherTextStart, cipherTextLength));
78
+ const newData = new ArrayBuffer(frameHeader.byteLength + plainText.byteLength);
79
+ const newUint8 = new Uint8Array(newData);
80
+ newUint8.set(new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength));
81
+ newUint8.set(new Uint8Array(plainText), frameHeader.byteLength);
82
+ encodedFrame.data = newData;
83
+ return encodedFrame;
84
+ }
85
+ catch (error) {
86
+ if (this._sharedKey) {
87
+ return;
88
+ }
89
+ if (ratchetCount < RATCHET_WINDOW_SIZE) {
90
+ const currentKey = this._cryptoKeyRing[this._currentKeyIndex];
91
+ material = await importKey(await ratchet(material));
92
+ const newKey = await deriveKeys(material);
93
+ this._setKeys(newKey);
94
+ return await this._decryptFrame(encodedFrame, keyIndex, initialKey || currentKey, ratchetCount + 1);
95
+ }
96
+ /**
97
+ * Since the key it is first send and only afterwards actually used for encrypting, there were
98
+ * situations when the decrypting failed due to the fact that the received frame was not encrypted
99
+ * yet and ratcheting, of course, did not solve the problem. So if we fail RATCHET_WINDOW_SIZE times,
100
+ * we come back to the initial key.
101
+ */
102
+ this._setKeys(initialKey);
103
+ // TODO: notify the application about error status.
104
+ }
105
+ }
106
+ /**
107
+ * Construct the IV used for AES-GCM and sent (in plain) with the packet similar to
108
+ * https://tools.ietf.org/html/rfc7714#section-8.1
109
+ * It concatenates
110
+ * - the 32 bit synchronization source (SSRC) given on the encoded frame,
111
+ * - the 32 bit rtp timestamp given on the encoded frame,
112
+ * - a send counter that is specific to the SSRC. Starts at a random number.
113
+ * The send counter is essentially the pictureId but we currently have to implement this ourselves.
114
+ * There is no XOR with a salt. Note that this IV leaks the SSRC to the receiver but since this is
115
+ * randomly generated and SFUs may not rewrite this is considered acceptable.
116
+ * The SSRC is used to allow demultiplexing multiple streams with the same key, as described in
117
+ * https://tools.ietf.org/html/rfc3711#section-4.1.1
118
+ * The RTP timestamp is 32 bits and advances by the codec clock rate (90khz for video, 48khz for
119
+ * opus audio) every second. For video it rolls over roughly every 13 hours.
120
+ * The send counter will advance at the frame rate (30fps for video, 50fps for 20ms opus audio)
121
+ * every second. It will take a long time to roll over.
122
+ *
123
+ * See also https://developer.mozilla.org/en-US/docs/Web/API/AesGcmParams
124
+ */
125
+ _makeIV(synchronizationSource, timestamp) {
126
+ const iv = new ArrayBuffer(IV_LENGTH);
127
+ const ivView = new DataView(iv);
128
+ // having to keep our own send count (similar to a picture id) is not ideal.
129
+ if (!this._sendCounts.has(synchronizationSource)) {
130
+ // Initialize with a random offset, similar to the RTP sequence number.
131
+ this._sendCounts.set(synchronizationSource, Math.floor(Math.random() * 0xFFFF));
132
+ }
133
+ const sendCount = this._sendCounts.get(synchronizationSource);
134
+ ivView.setUint32(0, synchronizationSource);
135
+ ivView.setUint32(4, timestamp);
136
+ ivView.setUint32(8, sendCount % 0xFFFF);
137
+ this._sendCounts.set(synchronizationSource, sendCount + 1);
138
+ return iv;
139
+ }
140
+ /**
141
+ * Sets a set of keys and resets the sendCount.
142
+ * decryption.
143
+ * @param {Object} keys set of keys.
144
+ * @param {Number} keyIndex optional
145
+ * @private
146
+ */
147
+ _setKeys(keys, keyIndex = -1) {
148
+ if (keyIndex >= 0) {
149
+ this._currentKeyIndex = keyIndex % this._cryptoKeyRing.length;
150
+ }
151
+ this._cryptoKeyRing[this._currentKeyIndex] = keys;
152
+ }
153
+ /**
154
+ * Enables or disables the E2EE context. When disabled packets are passed through.
155
+ * @param {boolean} enabled True if E2EE is enabled, false otherwise.
156
+ */
157
+ setEnabled(enabled) {
158
+ this._enabled = enabled;
159
+ }
160
+ /**
161
+ * Derives the different subkeys and starts using them for encryption or
162
+ * decryption.
163
+ * @param {Uint8Array|ArrayBuffer|false} key bytes. Pass false to disable.
164
+ * @param {Number} keyIndex
165
+ */
166
+ async setKey(key, keyIndex = -1) {
167
+ let newKey = false;
168
+ if (key) {
169
+ if (this._sharedKey) {
170
+ newKey = key;
171
+ }
172
+ else {
173
+ // Handle both Uint8Array and ArrayBuffer
174
+ let keyBuffer;
175
+ if (key instanceof ArrayBuffer) {
176
+ keyBuffer = key;
177
+ }
178
+ else {
179
+ // Convert Uint8Array to ArrayBuffer properly
180
+ keyBuffer = new ArrayBuffer(key.length);
181
+ new Uint8Array(keyBuffer).set(key);
182
+ }
183
+ const material = await importKey(keyBuffer);
184
+ newKey = await deriveKeys(material);
185
+ }
186
+ }
187
+ this._setKeys(newKey, keyIndex);
188
+ }
189
+ /**
190
+ * Function that will be injected in a stream and will encrypt the given encoded frames.
191
+ *
192
+ * @param {RTCEncodedVideoFrame|RTCEncodedAudioFrame} encodedFrame - Encoded video frame.
193
+ * @param {ITransformStreamDefaultController} controller - TransportStreamController.
194
+ *
195
+ * The VP8 payload descriptor described in
196
+ * https://tools.ietf.org/html/rfc7741#section-4.2
197
+ * is part of the RTP packet and not part of the frame and is not controllable by us.
198
+ * This is fine as the SFU keeps having access to it for routing.
199
+ *
200
+ * The encrypted frame is formed as follows:
201
+ * 1) Leave the first (10, 3, 1) bytes unencrypted, depending on the frame type and kind.
202
+ * 2) Form the GCM IV for the frame as described above.
203
+ * 3) Encrypt the rest of the frame using AES-GCM.
204
+ * 4) Allocate space for the encrypted frame.
205
+ * 5) Copy the unencrypted bytes to the start of the encrypted frame.
206
+ * 6) Append the ciphertext to the encrypted frame.
207
+ * 7) Append the IV.
208
+ * 8) Append a single byte for the key identifier.
209
+ * 9) Enqueue the encrypted frame for sending.
210
+ */
211
+ encodeFunction(encodedFrame, controller) {
212
+ if (!this._enabled) {
213
+ return controller.enqueue(encodedFrame);
214
+ }
215
+ const keyIndex = this._currentKeyIndex;
216
+ const currentKey = this._cryptoKeyRing[keyIndex];
217
+ if (currentKey) {
218
+ const iv = this._makeIV(encodedFrame.getMetadata().synchronizationSource, encodedFrame.timestamp);
219
+ // This is not encrypted and contains the VP8 payload descriptor or the Opus TOC byte.
220
+ const frameHeader = new Uint8Array(encodedFrame.data, 0, UNENCRYPTED_BYTES[encodedFrame.type]);
221
+ // Frame trailer contains the R|IV_LENGTH and key index
222
+ const frameTrailer = new Uint8Array(2);
223
+ frameTrailer[0] = IV_LENGTH;
224
+ frameTrailer[1] = keyIndex;
225
+ // Construct frame trailer. Similar to the frame header described in
226
+ // https://tools.ietf.org/html/draft-omara-sframe-00#section-4.2
227
+ // but we put it at the end.
228
+ //
229
+ // ---------+-------------------------+-+---------+----
230
+ // payload |IV...(length = IV_LENGTH)|R|IV_LENGTH|KID |
231
+ // ---------+-------------------------+-+---------+----
232
+ return crypto.subtle.encrypt({
233
+ additionalData: new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength),
234
+ iv,
235
+ name: ENCRYPTION_ALGORITHM
236
+ }, currentKey.encryptionKey, new Uint8Array(encodedFrame.data, UNENCRYPTED_BYTES[encodedFrame.type]))
237
+ .then(cipherText => {
238
+ const newData = new ArrayBuffer(frameHeader.byteLength + cipherText.byteLength
239
+ + iv.byteLength + frameTrailer.byteLength);
240
+ const newUint8 = new Uint8Array(newData);
241
+ newUint8.set(frameHeader); // copy first bytes.
242
+ newUint8.set(new Uint8Array(cipherText), frameHeader.byteLength); // add ciphertext.
243
+ newUint8.set(new Uint8Array(iv), frameHeader.byteLength + cipherText.byteLength); // append IV.
244
+ newUint8.set(frameTrailer, frameHeader.byteLength + cipherText.byteLength + iv.byteLength); // append frame trailer.
245
+ encodedFrame.data = newData;
246
+ return controller.enqueue(encodedFrame);
247
+ }, e => {
248
+ // TODO: surface this to the app.
249
+ console.error(e);
250
+ // We are not enqueuing the frame here on purpose.
251
+ });
252
+ }
253
+ }
254
+ /**
255
+ * Function that will be injected in a stream and will decrypt the given encoded frames.
256
+ *
257
+ * @param {RTCEncodedVideoFrame|RTCEncodedAudioFrame} encodedFrame - Encoded video frame.
258
+ * @param {ITransformStreamDefaultController} controller - TransportStreamController.
259
+ */
260
+ async decodeFunction(encodedFrame, controller) {
261
+ if (!this._enabled) {
262
+ return controller.enqueue(encodedFrame);
263
+ }
264
+ const data = new Uint8Array(encodedFrame.data);
265
+ const keyIndex = data[encodedFrame.data.byteLength - 1];
266
+ if (this._cryptoKeyRing[keyIndex]) {
267
+ const decodedFrame = await this._decryptFrame(encodedFrame, keyIndex);
268
+ if (decodedFrame) {
269
+ controller.enqueue(decodedFrame);
270
+ }
271
+ }
272
+ }
273
+ }
274
+ //# sourceMappingURL=Context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Context.js","sourceRoot":"","sources":["../../../../modules/e2ee/Context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ /* global RTCRtpScriptTransform */
2
+ import { getLogger } from '@jitsi/logger';
3
+ const logger = getLogger('e2ee:E2EEContext');
4
+ // Flag to set on senders / receivers to avoid setting up the encryption transform
5
+ // more than once.
6
+ const kJitsiE2EE = Symbol('kJitsiE2EE');
7
+ /**
8
+ * Context encapsulating the cryptography bits required for E2EE.
9
+ * This uses the WebRTC Insertable Streams API which is explained in
10
+ * https://github.com/alvestrand/webrtc-media-streams/blob/master/explainer.md
11
+ * that provides access to the encoded frames and allows them to be transformed.
12
+ *
13
+ * The encoded frame format is explained below in the _encodeFunction method.
14
+ * High level design goals were:
15
+ * - do not require changes to existing SFUs and retain (VP8) metadata.
16
+ * - allow the SFU to rewrite SSRCs, timestamp, pictureId.
17
+ * - allow for the key to be rotated frequently.
18
+ */
19
+ export default class E2EEcontext {
20
+ /**
21
+ * Build a new E2EE context instance, which will be used in a given conference.
22
+ * @param {boolean} [options.sharedKey] - whether there is a uniques key shared amoung all participants.
23
+ */
24
+ constructor({ sharedKey } = {}) {
25
+ // Determine the URL for the worker script. Relative URLs are relative to
26
+ // the entry point, not the script that launches the worker.
27
+ let baseUrl = '';
28
+ const ljm = document.querySelector('script[src*="lib-jitsi-meet"]');
29
+ if (ljm) {
30
+ const idx = ljm.src.lastIndexOf('/');
31
+ baseUrl = `${ljm.src.substring(0, idx)}/`;
32
+ }
33
+ let workerUrl = `${baseUrl}lib-jitsi-meet.e2ee-worker.js`;
34
+ // If there is no baseUrl then we create the worker in a normal way
35
+ // as you cant load scripts inside blobs from relative paths.
36
+ // See: https://www.html5rocks.com/en/tutorials/workers/basics/#toc-inlineworkers-loadingscripts
37
+ if (baseUrl && baseUrl !== '/') {
38
+ // Initialize the E2EE worker. In order to avoid CORS issues, start the worker and have it
39
+ // synchronously load the JS.
40
+ const workerBlob = new Blob([`importScripts("${workerUrl}");`], { type: 'application/javascript' });
41
+ workerUrl = window.URL.createObjectURL(workerBlob);
42
+ }
43
+ this._worker = new Worker(workerUrl, { name: 'E2EE Worker' });
44
+ this._worker.onerror = e => logger.error(e);
45
+ this._worker.postMessage({
46
+ operation: 'initialize',
47
+ sharedKey
48
+ });
49
+ }
50
+ /**
51
+ * Cleans up all state associated with the given participant. This is needed when a
52
+ * participant leaves the current conference.
53
+ *
54
+ * @param {string} participantId - The participant that just left.
55
+ */
56
+ cleanup(participantId) {
57
+ this._worker.postMessage({
58
+ operation: 'cleanup',
59
+ participantId
60
+ });
61
+ }
62
+ /**
63
+ * Cleans up all state associated with all participants in the conference. This is needed when disabling e2ee.
64
+ *
65
+ */
66
+ cleanupAll() {
67
+ this._worker.postMessage({
68
+ operation: 'cleanupAll'
69
+ });
70
+ }
71
+ /**
72
+ * Handles the given {@code RTCRtpReceiver} by creating a {@code TransformStream} which will inject
73
+ * a frame decoder.
74
+ *
75
+ * @param {RTCRtpReceiver} receiver - The receiver which will get the decoding function injected.
76
+ * @param {string} kind - The kind of track this receiver belongs to.
77
+ * @param {string} participantId - The participant id that this receiver belongs to.
78
+ */
79
+ handleReceiver(receiver, kind, participantId) {
80
+ if (receiver[kJitsiE2EE]) {
81
+ return;
82
+ }
83
+ receiver[kJitsiE2EE] = true;
84
+ if (window.RTCRtpScriptTransform) {
85
+ const options = {
86
+ operation: 'decode',
87
+ participantId
88
+ };
89
+ receiver.transform = new RTCRtpScriptTransform(this._worker, options);
90
+ }
91
+ else {
92
+ const receiverStreams = receiver.createEncodedStreams();
93
+ this._worker.postMessage({
94
+ operation: 'decode',
95
+ participantId,
96
+ readableStream: receiverStreams.readable,
97
+ writableStream: receiverStreams.writable
98
+ }, [receiverStreams.readable, receiverStreams.writable]);
99
+ }
100
+ }
101
+ /**
102
+ * Handles the given {@code RTCRtpSender} by creating a {@code TransformStream} which will inject
103
+ * a frame encoder.
104
+ *
105
+ * @param {RTCRtpSender} sender - The sender which will get the encoding function injected.
106
+ * @param {string} kind - The kind of track this sender belongs to.
107
+ * @param {string} participantId - The participant id that this sender belongs to.
108
+ */
109
+ handleSender(sender, kind, participantId) {
110
+ if (sender[kJitsiE2EE]) {
111
+ return;
112
+ }
113
+ sender[kJitsiE2EE] = true;
114
+ if (window.RTCRtpScriptTransform) {
115
+ const options = {
116
+ operation: 'encode',
117
+ participantId
118
+ };
119
+ sender.transform = new RTCRtpScriptTransform(this._worker, options);
120
+ }
121
+ else {
122
+ const senderStreams = sender.createEncodedStreams();
123
+ this._worker.postMessage({
124
+ operation: 'encode',
125
+ participantId,
126
+ readableStream: senderStreams.readable,
127
+ writableStream: senderStreams.writable
128
+ }, [senderStreams.readable, senderStreams.writable]);
129
+ }
130
+ }
131
+ /**
132
+ * Set the E2EE enabled state.
133
+ *
134
+ * @param {boolean} enabled - whether E2EE is enabled or not.
135
+ */
136
+ setEnabled(enabled) {
137
+ this._worker.postMessage({
138
+ enabled,
139
+ operation: 'setEnabled'
140
+ });
141
+ }
142
+ /**
143
+ * Set the E2EE key for the specified participant.
144
+ *
145
+ * @param {string} participantId - the ID of the participant who's key we are setting.
146
+ * @param {Uint8Array | boolean} key - they key for the given participant.
147
+ * @param {Number} keyIndex - the key index.
148
+ */
149
+ setKey(participantId, key, keyIndex) {
150
+ this._worker.postMessage({
151
+ key,
152
+ keyIndex,
153
+ operation: 'setKey',
154
+ participantId
155
+ });
156
+ }
157
+ }
158
+ //# sourceMappingURL=E2EEContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"E2EEContext.js","sourceRoot":"","sources":["../../../../modules/e2ee/E2EEContext.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export var E2EEErrors;
2
+ (function (E2EEErrors) {
3
+ E2EEErrors["E2EE_SAS_CHANNEL_VERIFICATION_FAILED"] = "e2ee.sas.channel-verification-failed";
4
+ E2EEErrors["E2EE_SAS_COMMITMENT_MISMATCHED"] = "e2ee.sas.commitment-mismatched";
5
+ E2EEErrors["E2EE_SAS_INVALID_SAS_VERIFICATION"] = "e2ee.sas.invalid-sas-verification";
6
+ E2EEErrors["E2EE_SAS_KEYS_MAC_MISMATCH"] = "e2ee.sas.keys-mac-mismatch";
7
+ E2EEErrors["E2EE_SAS_MAC_MISMATCH"] = "e2ee.sas.mac-mismatch";
8
+ E2EEErrors["E2EE_SAS_MISSING_KEY"] = "e2ee.sas.missing-key";
9
+ })(E2EEErrors || (E2EEErrors = {}));
10
+ //# sourceMappingURL=E2EEErrors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"E2EEErrors.js","sourceRoot":"","sources":["../../../../modules/e2ee/E2EEErrors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,UAOX;AAPD,WAAY,UAAU;IAClB,2FAA6E,CAAA;IAC7E,+EAAiE,CAAA;IACjE,qFAAuE,CAAA;IACvE,uEAAyD,CAAA;IACzD,6DAA+C,CAAA;IAC/C,2DAA6C,CAAA;AACjD,CAAC,EAPW,UAAU,KAAV,UAAU,QAOrB"}
@@ -0,0 +1,87 @@
1
+ import browser from '../browser';
2
+ import { ExternallyManagedKeyHandler } from './ExternallyManagedKeyHandler';
3
+ import { ManagedKeyHandler } from './ManagedKeyHandler';
4
+ import { OlmAdapter } from './OlmAdapter';
5
+ /**
6
+ * This module integrates {@link KeyHandler} with {@link JitsiConference} in order to enable E2E encryption.
7
+ */
8
+ export class E2EEncryption {
9
+ /**
10
+ * A constructor.
11
+ * @param {JitsiConference} conference - The conference instance for which E2E encryption is to be enabled.
12
+ */
13
+ constructor(conference) {
14
+ const { e2ee = {} } = conference.options.config;
15
+ this._externallyManaged = e2ee.externallyManagedKey;
16
+ if (this._externallyManaged) {
17
+ this._keyHandler = new ExternallyManagedKeyHandler(conference);
18
+ }
19
+ else {
20
+ this._keyHandler = new ManagedKeyHandler(conference);
21
+ }
22
+ }
23
+ /**
24
+ * Indicates if E2EE is supported in the current platform.
25
+ *
26
+ * @param {object} config - Global configuration.
27
+ * @returns {boolean}
28
+ */
29
+ static isSupported(config) {
30
+ const { e2ee = {} } = config;
31
+ if (!e2ee.externallyManagedKey && !OlmAdapter.isSupported()) {
32
+ return false;
33
+ }
34
+ if (e2ee.disabled || config.testing?.disableE2EE) {
35
+ return false;
36
+ }
37
+ return browser.supportsInsertableStreams()
38
+ || (config.enableEncodedTransformSupport && browser.supportsEncodedTransform());
39
+ }
40
+ /**
41
+ * Indicates whether E2EE is currently enabled or not.
42
+ *
43
+ * @returns {boolean}
44
+ */
45
+ isEnabled() {
46
+ return this._keyHandler.isEnabled();
47
+ }
48
+ /**
49
+ * Enables / disables End-To-End encryption.
50
+ *
51
+ * @param {boolean} enabled - whether E2EE should be enabled or not.
52
+ * @returns {void}
53
+ */
54
+ async setEnabled(enabled) {
55
+ await this._keyHandler.setEnabled(enabled);
56
+ }
57
+ /**
58
+ * Sets the key and index for End-to-End encryption.
59
+ *
60
+ * @param {CryptoKey} [keyInfo.encryptionKey] - encryption key.
61
+ * @param {Number} [keyInfo.index] - the index of the encryption key.
62
+ * @returns {void}
63
+ */
64
+ setEncryptionKey(keyInfo) {
65
+ this._keyHandler.setKey(keyInfo);
66
+ }
67
+ /**
68
+ * Starts the verification process of the participant
69
+ *
70
+ * @param {Participant} - participant to be verified.
71
+ * @returns {void}
72
+ */
73
+ startVerification(participant) {
74
+ this._keyHandler.sasVerification?.startVerification(participant);
75
+ }
76
+ /**
77
+ * Marks the channel as verified
78
+ *
79
+ * @param {Participant} - participant to be verified.
80
+ * @param {boolean} isVerified - whether the verification was succesfull.
81
+ * @returns {void}
82
+ */
83
+ markParticipantVerified(participant, isVerified) {
84
+ this._keyHandler.sasVerification?.markParticipantVerified(participant, isVerified);
85
+ }
86
+ }
87
+ //# sourceMappingURL=E2EEncryption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"E2EEncryption.js","sourceRoot":"","sources":["../../../../modules/e2ee/E2EEncryption.js"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;GAEG;AACH,MAAM,OAAO,aAAa;IACtB;;;OAGG;IACH,YAAY,UAAU;QAClB,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;QAEhD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAEpD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,2BAA2B,CAAC,UAAU,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,WAAW,GAAG,IAAI,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM;QACrB,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;QAE7B,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;YAC1D,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,OAAO,CAAC,yBAAyB,EAAE;eAC/B,CAAC,MAAM,CAAC,6BAA6B,IAAI,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED;;;;OAIG;IACH,SAAS;QACL,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,OAAO;QACpB,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;OAMG;IACH,gBAAgB,CAAC,OAAO;QACpB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED;;;;;OAKG;IACH,iBAAiB,CAAC,WAAW;QACzB,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;OAMG;IACH,uBAAuB,CAAC,WAAW,EAAE,UAAU;QAC3C,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,uBAAuB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACvF,CAAC;CACJ"}
@@ -0,0 +1,24 @@
1
+ import { KeyHandler } from './KeyHandler';
2
+ /**
3
+ * This module integrates {@link E2EEContext} with {external} in order to set the keys for encryption.
4
+ */
5
+ export class ExternallyManagedKeyHandler extends KeyHandler {
6
+ /**
7
+ * Build a new ExternallyManagedKeyHandler instance, which will be used in a given conference.
8
+ * @param conference - the current conference.
9
+ */
10
+ constructor(conference) {
11
+ super(conference, { sharedKey: true });
12
+ }
13
+ /**
14
+ * Sets the key and index for End-to-End encryption.
15
+ *
16
+ * @param {CryptoKey} [keyInfo.encryptionKey] - encryption key.
17
+ * @param {Number} [keyInfo.index] - the index of the encryption key.
18
+ * @returns {void}
19
+ */
20
+ setKey(keyInfo) {
21
+ this.e2eeCtx.setKey(undefined, { encryptionKey: keyInfo.encryptionKey }, keyInfo.index);
22
+ }
23
+ }
24
+ //# sourceMappingURL=ExternallyManagedKeyHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExternallyManagedKeyHandler.js","sourceRoot":"","sources":["../../../../modules/e2ee/ExternallyManagedKeyHandler.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,UAAU;IACvD;;;OAGG;IACH,YAAY,UAAU;QAClB,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,OAAO;QACV,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5F,CAAC;CACJ"}