@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,404 @@
1
+ import { getLogger } from '@jitsi/logger';
2
+ import { cloneDeep } from 'lodash-es';
3
+ import { $iq, Strophe } from 'strophe.js';
4
+ import { XMPPEvents } from '../../service/xmpp/XMPPEvents';
5
+ import RandomUtil from '../util/RandomUtil';
6
+ import { findAll, findFirst, getAttribute, getText } from '../util/XMLUtils';
7
+ import ConnectionPlugin from './ConnectionPlugin';
8
+ import { expandSourcesFromJson } from './JingleHelperFunctions';
9
+ import JingleSessionPC from './JingleSessionPC';
10
+ import { handleStropheError } from './StropheErrorHandler';
11
+ const logger = getLogger('xmpp:strophe.jingle');
12
+ // XXX Strophe is build around the idea of chaining function calls so allow long
13
+ // function call chains.
14
+ /* eslint-disable newline-per-chained-call */
15
+ /**
16
+ * Parses the transport XML element and returns the list of ICE candidates formatted as text.
17
+ *
18
+ * @param {*} transport Transport XML element extracted from the IQ.
19
+ * @returns {Array<string>}
20
+ */
21
+ function _parseIceCandidates(transport) {
22
+ const candidates = findAll(transport, ':scope>candidate');
23
+ const parseCandidates = [];
24
+ // Extract the candidate information from the IQ.
25
+ candidates.forEach(candidate => {
26
+ const attributes = candidate.attributes;
27
+ const candidateAttrs = [];
28
+ for (let i = 0; i < attributes.length; i++) {
29
+ const attr = attributes[i];
30
+ candidateAttrs.push(`${attr.name}: ${attr.value}`);
31
+ }
32
+ parseCandidates.push(candidateAttrs.join(' '));
33
+ });
34
+ return parseCandidates;
35
+ }
36
+ /**
37
+ *
38
+ */
39
+ export default class JingleConnectionPlugin extends ConnectionPlugin {
40
+ /**
41
+ * Creates new <tt>JingleConnectionPlugin</tt>
42
+ * @param {XMPP} xmpp
43
+ * @param {EventEmitter} eventEmitter
44
+ * @param {Object} iceConfig an object that holds the iceConfig to be passed
45
+ * to the p2p and the jvb <tt>PeerConnection</tt>.
46
+ */
47
+ constructor(xmpp, eventEmitter, iceConfig) {
48
+ super();
49
+ this.xmpp = xmpp;
50
+ this.eventEmitter = eventEmitter;
51
+ this.sessions = {};
52
+ this.jvbIceConfig = iceConfig.jvb;
53
+ this.p2pIceConfig = iceConfig.p2p;
54
+ this.mediaConstraints = {
55
+ offerToReceiveAudio: true,
56
+ offerToReceiveVideo: true
57
+ };
58
+ }
59
+ /**
60
+ *
61
+ * @param connection
62
+ */
63
+ init(connection) {
64
+ super.init(connection);
65
+ this.connection.addHandler(this.onJingle.bind(this), 'urn:xmpp:jingle:1', 'iq', 'set', null, null);
66
+ }
67
+ /**
68
+ *
69
+ * @param iq
70
+ */
71
+ onJingle(iq) {
72
+ const jingleElement = findFirst(iq, 'jingle');
73
+ const sid = getAttribute(jingleElement, 'sid');
74
+ const action = getAttribute(jingleElement, 'action');
75
+ const fromJid = getAttribute(iq, 'from');
76
+ // send ack first
77
+ const ack = $iq({ id: iq.getAttribute('id'),
78
+ to: fromJid,
79
+ type: 'result'
80
+ });
81
+ let sess = this.sessions[sid];
82
+ if (action !== 'session-initiate') {
83
+ if (!sess) {
84
+ ack.attrs({ type: 'error' });
85
+ ack.c('error', { type: 'cancel' })
86
+ .c('item-not-found', {
87
+ xmlns: 'urn:ietf:params:xml:ns:xmpp-stanzas'
88
+ })
89
+ .up()
90
+ .c('unknown-session', {
91
+ xmlns: 'urn:xmpp:jingle:errors:1'
92
+ });
93
+ logger.warn(`invalid session id: ${sid}`);
94
+ logger.debug(iq);
95
+ this.connection.send(ack);
96
+ return true;
97
+ }
98
+ // local jid is not checked
99
+ if (fromJid !== sess.remoteJid) {
100
+ logger.warn('jid mismatch for session id', sid, sess.remoteJid, iq);
101
+ ack.attrs({ type: 'error' });
102
+ ack.c('error', { type: 'cancel' })
103
+ .c('item-not-found', {
104
+ xmlns: 'urn:ietf:params:xml:ns:xmpp-stanzas'
105
+ })
106
+ .up()
107
+ .c('unknown-session', {
108
+ xmlns: 'urn:xmpp:jingle:errors:1'
109
+ });
110
+ this.connection.send(ack);
111
+ return true;
112
+ }
113
+ }
114
+ else if (sess !== undefined) {
115
+ // Existing session with same session id. This might be out-of-order
116
+ // if the sess.remoteJid is the same as from.
117
+ ack.attrs({ type: 'error' });
118
+ ack.c('error', { type: 'cancel' })
119
+ .c('service-unavailable', {
120
+ xmlns: 'urn:ietf:params:xml:ns:xmpp-stanzas'
121
+ })
122
+ .up();
123
+ logger.warn('duplicate session id', sid, iq);
124
+ this.connection.send(ack);
125
+ return true;
126
+ }
127
+ const now = window.performance.now();
128
+ // FIXME that should work most of the time, but we'd have to
129
+ // think how secure it is to assume that user with "focus"
130
+ // nickname is Jicofo.
131
+ const isP2P = Strophe.getResourceFromJid(fromJid) !== 'focus';
132
+ // see http://xmpp.org/extensions/xep-0166.html#concepts-session
133
+ const jsonMessages = findAll(iq, 'jingle>json-message');
134
+ if (jsonMessages?.length) {
135
+ let audioVideoSsrcs;
136
+ logger.info(`Found a JSON-encoded element in ${action}, translating to standard Jingle.`);
137
+ for (let i = 0; i < jsonMessages.length; i++) {
138
+ // Currently there is always a single json-message in the IQ with the source information.
139
+ audioVideoSsrcs = expandSourcesFromJson(iq, jsonMessages[i]);
140
+ }
141
+ if (audioVideoSsrcs?.size) {
142
+ const logMessage = [];
143
+ for (const endpoint of audioVideoSsrcs.keys()) {
144
+ logMessage.push(`${endpoint}:[${audioVideoSsrcs.get(endpoint)}]`);
145
+ }
146
+ logger.debug(`Received ${action} from ${fromJid} with sources=${logMessage.join(', ')}`);
147
+ }
148
+ // TODO: is there a way to remove the json-message elements once we've extracted the information?
149
+ // removeChild doesn't seem to work.
150
+ }
151
+ switch (action) {
152
+ case 'session-initiate': {
153
+ logger.info('(TIME) received session-initiate:\t', now);
154
+ isP2P && logger.debug(`Received ${action} from ${fromJid}`);
155
+ const pcConfig = isP2P ? this.p2pIceConfig : this.jvbIceConfig;
156
+ sess
157
+ = new JingleSessionPC(sid, iq.getAttribute('to'), fromJid, this.connection, this.mediaConstraints, cloneDeep(pcConfig), isP2P,
158
+ /* initiator */ false);
159
+ this.sessions[sess.sid] = sess;
160
+ this.eventEmitter.emit(XMPPEvents.CALL_INCOMING, sess, jingleElement, now);
161
+ break;
162
+ }
163
+ case 'session-accept': {
164
+ const ssrcs = [];
165
+ // Extract the SSRCs from the session-accept received from a p2p peer.
166
+ findAll(iq, 'jingle>content').forEach(content => {
167
+ const ssrc = getAttribute(findFirst(content, 'description'), 'ssrc');
168
+ ssrc && ssrcs.push(ssrc);
169
+ });
170
+ logger.debug(`Received ${action} from ${fromJid} with ssrcs=${ssrcs}`);
171
+ this.eventEmitter.emit(XMPPEvents.CALL_ACCEPTED, sess, jingleElement);
172
+ break;
173
+ }
174
+ case 'content-modify': {
175
+ logger.debug(`Received ${action} from ${fromJid}`);
176
+ sess.modifyContents(jingleElement);
177
+ break;
178
+ }
179
+ case 'transport-info': {
180
+ const candidates = _parseIceCandidates(findFirst(iq, 'jingle>content>transport'));
181
+ logger.debug(`Received ${action} from ${fromJid} for candidates=${candidates.join(', ')}`);
182
+ this.eventEmitter.emit(XMPPEvents.TRANSPORT_INFO, sess, jingleElement);
183
+ break;
184
+ }
185
+ case 'session-terminate': {
186
+ logger.info('terminating...', sess.sid);
187
+ let reasonCondition = null;
188
+ let reasonText = null;
189
+ const reasonElement = findFirst(iq, ':scope>jingle>reason');
190
+ if (reasonElement) {
191
+ const firstReasonChild = reasonElement.children?.length > 0 ? reasonElement.children[0] : undefined;
192
+ reasonCondition = firstReasonChild ? firstReasonChild.tagName : null;
193
+ reasonText = getText(findFirst(iq, ':scope>jingle>reason>text'));
194
+ }
195
+ logger.debug(`Received ${action} from ${fromJid} disconnect reason=${reasonText}`);
196
+ this.terminate(sess.sid, reasonCondition, reasonText);
197
+ this.eventEmitter.emit(XMPPEvents.CALL_ENDED, sess, reasonCondition, reasonText);
198
+ break;
199
+ }
200
+ case 'transport-replace':
201
+ logger.error(`Ignoring ${action} from ${fromJid} as it is not supported by the client.`);
202
+ break;
203
+ case 'source-add':
204
+ sess.addRemoteStream(findAll(iq, ':scope>jingle>content'));
205
+ break;
206
+ case 'source-remove':
207
+ sess.removeRemoteStream(findAll(iq, ':scope>jingle>content'));
208
+ break;
209
+ default:
210
+ logger.warn('jingle action not implemented', action);
211
+ ack.attrs({ type: 'error' });
212
+ ack.c('error', { type: 'cancel' })
213
+ .c('bad-request', { xmlns: 'urn:ietf:params:xml:ns:xmpp-stanzas' })
214
+ .up();
215
+ break;
216
+ }
217
+ this.connection.send(ack);
218
+ return true;
219
+ }
220
+ /**
221
+ * Creates new <tt>JingleSessionPC</tt> meant to be used in a direct P2P
222
+ * connection, configured as 'initiator'.
223
+ * @param {string} me our JID
224
+ * @param {string} peer remote participant's JID
225
+ * @return {JingleSessionPC}
226
+ */
227
+ newP2PJingleSession(me, peer) {
228
+ const sess = new JingleSessionPC(RandomUtil.randomHexString(12), me, peer, this.connection, this.mediaConstraints, this.p2pIceConfig,
229
+ /* P2P */ true,
230
+ /* initiator */ true);
231
+ this.sessions[sess.sid] = sess;
232
+ return sess;
233
+ }
234
+ /**
235
+ *
236
+ * @param sid
237
+ * @param reasonCondition
238
+ * @param reasonText
239
+ */
240
+ terminate(sid, reasonCondition = undefined, reasonText = undefined) {
241
+ if (this.sessions.hasOwnProperty(sid)) {
242
+ if (this.sessions[sid].state !== 'ended') {
243
+ this.sessions[sid].onTerminated(reasonCondition, reasonText);
244
+ }
245
+ delete this.sessions[sid];
246
+ }
247
+ }
248
+ /**
249
+ *
250
+ */
251
+ getStunAndTurnCredentials() {
252
+ // get stun and turn configuration from server via xep-0215
253
+ // uses time-limited credentials as described in
254
+ // http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00
255
+ //
256
+ // See https://modules.prosody.im/mod_turncredentials.html
257
+ // for a prosody module which implements this.
258
+ // Or the new implementation https://modules.prosody.im/mod_external_services which will be in prosody 0.12
259
+ //
260
+ // Currently, this doesn't work with updateIce and therefore credentials
261
+ // with a long validity have to be fetched before creating the
262
+ // peerconnection.
263
+ // TODO: implement refresh via updateIce as described in
264
+ // https://code.google.com/p/webrtc/issues/detail?id=1650
265
+ this.connection.sendIQ($iq({ to: this.xmpp.options.hosts.domain,
266
+ type: 'get' })
267
+ .c('services', { xmlns: 'urn:xmpp:extdisco:2' }), v2Res => this.onReceiveStunAndTurnCredentials(v2Res), error => {
268
+ handleStropheError(error, {
269
+ domain: this.xmpp.options.hosts.domain,
270
+ operation: 'get STUN/TURN credentials (extdisco:2)',
271
+ userJid: this.connection.jid,
272
+ xmlns: 'urn:xmpp:extdisco:2'
273
+ });
274
+ logger.warn('getting turn credentials with extdisco:2 failed, trying extdisco:1');
275
+ this.connection.sendIQ($iq({ to: this.xmpp.options.hosts.domain,
276
+ type: 'get' })
277
+ .c('services', { xmlns: 'urn:xmpp:extdisco:1' }), v1Res => this.onReceiveStunAndTurnCredentials(v1Res), err => {
278
+ handleStropheError(err, {
279
+ domain: this.xmpp.options.hosts.domain,
280
+ operation: 'get STUN/TURN credentials (extdisco:1)',
281
+ userJid: this.connection.jid,
282
+ xmlns: 'urn:xmpp:extdisco:1'
283
+ });
284
+ logger.warn('getting turn credentials failed');
285
+ logger.warn('is mod_turncredentials or similar installed and configured?');
286
+ });
287
+ });
288
+ }
289
+ /**
290
+ * Parses response when querying for services using urn:xmpp:extdisco:1 or urn:xmpp:extdisco:2.
291
+ * Stores results in jvbIceConfig and p2pIceConfig.
292
+ * @param res The response iq.
293
+ * @return {boolean} Whether something was processed from the supplied message.
294
+ */
295
+ onReceiveStunAndTurnCredentials(res) {
296
+ let iceservers = [];
297
+ findAll(res, ':scope>services>service').forEach(el => {
298
+ const dict = {};
299
+ const type = getAttribute(el, 'type');
300
+ switch (type) {
301
+ case 'stun': {
302
+ dict.urls = `stun:${getAttribute(el, 'host')}`;
303
+ const port = getAttribute(el, 'port');
304
+ if (port) {
305
+ dict.urls += `:${port}`;
306
+ }
307
+ iceservers.push(dict);
308
+ break;
309
+ }
310
+ case 'turn':
311
+ case 'turns': {
312
+ dict.urls = `${type}:`;
313
+ dict.username = getAttribute(el, 'username');
314
+ dict.urls += getAttribute(el, 'host');
315
+ const turnPort = getAttribute(el, 'port');
316
+ if (turnPort) {
317
+ dict.urls += `:${turnPort}`;
318
+ }
319
+ const transport = getAttribute(el, 'transport');
320
+ if (transport && transport !== 'udp') {
321
+ dict.urls += `?transport=${transport}`;
322
+ }
323
+ dict.credential = getAttribute(el, 'password') || dict.credential;
324
+ iceservers.push(dict);
325
+ break;
326
+ }
327
+ }
328
+ });
329
+ const options = this.xmpp.options;
330
+ const { iceServersOverride = [] } = options;
331
+ iceServersOverride.forEach(({ targetType, urls, username, credential }) => {
332
+ if (!['turn', 'turns', 'stun'].includes(targetType)) {
333
+ return;
334
+ }
335
+ const pattern = `${targetType}:`;
336
+ if (typeof urls === 'undefined'
337
+ && typeof username === 'undefined'
338
+ && typeof credential === 'undefined') {
339
+ return;
340
+ }
341
+ if (urls === null) { // remove this type of ice server
342
+ iceservers = iceservers.filter(server => !server.urls.startsWith(pattern));
343
+ }
344
+ iceservers.forEach(server => {
345
+ if (!server.urls.startsWith(pattern)) {
346
+ return;
347
+ }
348
+ server.urls = urls ?? server.urls;
349
+ if (username === null) {
350
+ delete server.username;
351
+ }
352
+ else {
353
+ server.username = username ?? server.username;
354
+ }
355
+ if (credential === null) {
356
+ delete server.credential;
357
+ }
358
+ else {
359
+ server.credential = credential ?? server.credential;
360
+ }
361
+ });
362
+ });
363
+ // Shuffle ICEServers for loadbalancing
364
+ for (let i = iceservers.length - 1; i > 0; i--) {
365
+ const j = Math.floor(Math.random() * (i + 1));
366
+ const temp = iceservers[i];
367
+ iceservers[i] = iceservers[j];
368
+ iceservers[j] = temp;
369
+ }
370
+ let filter;
371
+ if (options.useTurnUdp) {
372
+ filter = s => s.urls.startsWith('turn');
373
+ }
374
+ else {
375
+ // By default we filter out STUN and TURN/UDP and leave only TURN/TCP.
376
+ filter = s => s.urls.startsWith('turn') && (s.urls.indexOf('transport=tcp') >= 0);
377
+ }
378
+ this.jvbIceConfig.iceServers = iceservers.filter(filter);
379
+ this.p2pIceConfig.iceServers = iceservers;
380
+ return iceservers.length > 0;
381
+ }
382
+ /**
383
+ * Returns the data saved in 'updateLog' in a format to be logged.
384
+ * @returns {Record<string, unknown>} An object containing the data to be logged.
385
+ */
386
+ getLog() {
387
+ const data = {};
388
+ Object.keys(this.sessions).forEach(sid => {
389
+ const session = this.sessions[sid];
390
+ const pc = session.peerconnection;
391
+ if (pc && pc.updateLog) {
392
+ // FIXME: should probably be a .dump call
393
+ data[`jingle_${sid}`] = {
394
+ stats: pc.stats,
395
+ updateLog: pc.updateLog,
396
+ url: window.location.href
397
+ };
398
+ }
399
+ });
400
+ return data;
401
+ }
402
+ }
403
+ /* eslint-enable newline-per-chained-call */
404
+ //# sourceMappingURL=strophe.jingle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strophe.jingle.js","sourceRoot":"","sources":["../../../../modules/xmpp/strophe.jingle.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,UAAU,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE7E,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC;AAEhD,gFAAgF;AAChF,wBAAwB;AACxB,6CAA6C;AAE7C;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,SAAS;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,EAAE,CAAC;IAE3B,iDAAiD;IACjD,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QAC3B,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;QACxC,MAAM,cAAc,GAAG,EAAE,CAAC;QAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAE3B,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,gBAAgB;IAChE;;;;;;OAMG;IACH,YAAY,IAAI,EAAE,YAAY,EAAE,SAAS;QACrC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC;QAClC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC;QAClC,IAAI,CAAC,gBAAgB,GAAG;YACpB,mBAAmB,EAAE,IAAI;YACzB,mBAAmB,EAAE,IAAI;SAC5B,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,UAAU;QACX,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAC/C,mBAAmB,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,EAAE;QACP,MAAM,aAAa,GAAG,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAEzC,iBAAiB;QACjB,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;YACvC,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,QAAQ;SACjB,CAAC,CAAC;QAEH,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE9B,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACR,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC7B,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;qBAC7B,CAAC,CAAC,gBAAgB,EAAE;oBACjB,KAAK,EAAE,qCAAqC;iBAC/C,CAAC;qBACD,EAAE,EAAE;qBACJ,CAAC,CAAC,iBAAiB,EAAE;oBAClB,KAAK,EAAE,0BAA0B;iBACpC,CAAC,CAAC;gBACP,MAAM,CAAC,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;gBAC1C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACjB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAE1B,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,2BAA2B;YAC3B,IAAI,OAAO,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CACP,6BAA6B,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBAC5D,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC7B,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;qBAC7B,CAAC,CAAC,gBAAgB,EAAE;oBACjB,KAAK,EAAE,qCAAqC;iBAC/C,CAAC;qBACD,EAAE,EAAE;qBACJ,CAAC,CAAC,iBAAiB,EAAE;oBAClB,KAAK,EAAE,0BAA0B;iBACpC,CAAC,CAAC;gBACP,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAE1B,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,oEAAoE;YACpE,6CAA6C;YAC7C,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7B,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;iBAC7B,CAAC,CAAC,qBAAqB,EAAE;gBACtB,KAAK,EAAE,qCAAqC;aAC/C,CAAC;iBACD,EAAE,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE1B,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;QAErC,4DAA4D;QAC5D,0DAA0D;QAC1D,sBAAsB;QACtB,MAAM,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC;QAE9D,gEAAgE;QAEhE,MAAM,YAAY,GAAG,OAAO,CAAC,EAAE,EAAE,qBAAqB,CAAC,CAAC;QAExD,IAAI,YAAY,EAAE,MAAM,EAAE,CAAC;YACvB,IAAI,eAAe,CAAC;YAEpB,MAAM,CAAC,IAAI,CAAC,mCAAmC,MAAM,mCAAmC,CAAC,CAAC;YAC1F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,yFAAyF;gBACzF,eAAe,GAAG,qBAAqB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC;YAED,IAAI,eAAe,EAAE,IAAI,EAAE,CAAC;gBACxB,MAAM,UAAU,GAAG,EAAE,CAAC;gBAEtB,KAAK,MAAM,QAAQ,IAAI,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC5C,UAAU,CAAC,IAAI,CAAC,GAAG,QAAQ,KAAK,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACtE,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,YAAY,MAAM,SAAS,OAAO,iBAAiB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7F,CAAC;YAED,iGAAiG;YACjG,oCAAoC;QACxC,CAAC;QAED,QAAQ,MAAM,EAAE,CAAC;YACjB,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;gBAExD,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,MAAM,SAAS,OAAO,EAAE,CAAC,CAAC;gBAC5D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;gBAE/D,IAAI;sBACE,IAAI,eAAe,CACjB,GAAG,EACH,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EACrB,OAAO,EACP,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,gBAAgB,EACrB,SAAS,CAAC,QAAQ,CAAC,EACnB,KAAK;oBACL,eAAe,CAAC,KAAK,CAAC,CAAC;gBAE/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;gBAC3E,MAAM;YACV,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACpB,MAAM,KAAK,GAAG,EAAE,CAAC;gBAEjB,sEAAsE;gBACtE,OAAO,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBAC5C,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;oBAErE,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,KAAK,CAAC,YAAY,MAAM,SAAS,OAAO,eAAe,KAAK,EAAE,CAAC,CAAC;gBACvE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;gBACtE,MAAM;YACV,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACpB,MAAM,CAAC,KAAK,CAAC,YAAY,MAAM,SAAS,OAAO,EAAE,CAAC,CAAC;gBACnD,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;gBACnC,MAAM;YACV,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACpB,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAC;gBAElF,MAAM,CAAC,KAAK,CAAC,YAAY,MAAM,SAAS,OAAO,mBAAmB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC3F,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;gBACvE,MAAM;YACV,CAAC;YACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,eAAe,GAAG,IAAI,CAAC;gBAC3B,IAAI,UAAU,GAAG,IAAI,CAAC;gBAEtB,MAAM,aAAa,GAAG,SAAS,CAAC,EAAE,EAAE,sBAAsB,CAAC,CAAC;gBAE5D,IAAI,aAAa,EAAE,CAAC;oBAChB,MAAM,gBAAgB,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBAEpG,eAAe,GAAG,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;oBACrE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,2BAA2B,CAAC,CAAC,CAAC;gBACrE,CAAC;gBAED,MAAM,CAAC,KAAK,CAAC,YAAY,MAAM,SAAS,OAAO,sBAAsB,UAAU,EAAE,CAAC,CAAC;gBACnF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;gBACtD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;gBACjF,MAAM;YACV,CAAC;YACD,KAAK,mBAAmB;gBACpB,MAAM,CAAC,KAAK,CAAC,YAAY,MAAM,SAAS,OAAO,wCAAwC,CAAC,CAAC;gBACzF,MAAM;YACV,KAAK,YAAY;gBACb,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC;gBAC3D,MAAM;YACV,KAAK,eAAe;gBAChB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC;gBAC9D,MAAM;YACV;gBACI,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,MAAM,CAAC,CAAC;gBACrD,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC7B,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;qBAC7B,CAAC,CAAC,aAAa,EACZ,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC;qBACpD,EAAE,EAAE,CAAC;gBACV,MAAM;QACV,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE1B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,EAAE,IAAI;QACxB,MAAM,IAAI,GACJ,IAAI,eAAe,CACjB,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC,EAC9B,EAAE,EACF,IAAI,EACJ,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,YAAY;QACjB,SAAS,CAAC,IAAI;QACd,eAAe,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QAE/B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,SAAS,EAAE,UAAU,GAAG,SAAS;QAC9D,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;gBACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;IACL,CAAC;IAED;;OAEG;IACH,yBAAyB;QACrB,2DAA2D;QAC3D,gDAAgD;QAChD,8DAA8D;QAC9D,EAAE;QACF,0DAA0D;QAC1D,8CAA8C;QAC9C,2GAA2G;QAC3G,EAAE;QACF,wEAAwE;QACxE,8DAA8D;QAC9D,kBAAkB;QAClB,wDAAwD;QACxD,8DAA8D;QAC9D,IAAI,CAAC,UAAU,CAAC,MAAM,CAClB,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;YACpC,IAAI,EAAE,KAAK,EAAE,CAAC;aACb,CAAC,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,EACpD,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC,EACpD,KAAK,CAAC,EAAE;YACJ,kBAAkB,CAAC,KAAK,EAAE;gBACtB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;gBACtC,SAAS,EAAE,wCAAwC;gBACnD,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG;gBAC5B,KAAK,EAAE,qBAAqB;aAC/B,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;YAClF,IAAI,CAAC,UAAU,CAAC,MAAM,CAClB,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;gBACpC,IAAI,EAAE,KAAK,EAAE,CAAC;iBACb,CAAC,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,EACpD,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC,EACpD,GAAG,CAAC,EAAE;gBACF,kBAAkB,CAAC,GAAG,EAAE;oBACpB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;oBACtC,SAAS,EAAE,wCAAwC;oBACnD,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG;oBAC5B,KAAK,EAAE,qBAAqB;iBAC/B,CAAC,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;YAC/E,CAAC,CACJ,CAAC;QACN,CAAC,CAAC,CAAC;IACX,CAAC;IAED;;;;;OAKG;IACH,+BAA+B,CAAC,GAAG;QAC/B,IAAI,UAAU,GAAG,EAAE,CAAC;QAEpB,OAAO,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YACjD,MAAM,IAAI,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAEtC,QAAQ,IAAI,EAAE,CAAC;gBACf,KAAK,MAAM,CAAC,CAAC,CAAC;oBACV,IAAI,CAAC,IAAI,GAAG,QAAQ,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;oBAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;oBAEtC,IAAI,IAAI,EAAE,CAAC;wBACP,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;oBAC5B,CAAC;oBACD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtB,MAAM;gBACV,CAAC;gBACD,KAAK,MAAM,CAAC;gBACZ,KAAK,OAAO,CAAC,CAAC,CAAC;oBACX,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;oBACvB,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;oBAC7C,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;oBACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;oBAE1C,IAAI,QAAQ,EAAE,CAAC;wBACX,IAAI,CAAC,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;oBAChC,CAAC;oBACD,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;oBAEhD,IAAI,SAAS,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;wBACnC,IAAI,CAAC,IAAI,IAAI,cAAc,SAAS,EAAE,CAAC;oBAC3C,CAAC;oBAED,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC;oBAClE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtB,MAAM;gBACV,CAAC;YACD,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QAClC,MAAM,EAAE,kBAAkB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;QAE5C,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;YACtE,IAAI,CAAC,CAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpD,OAAO;YACX,CAAC;YAED,MAAM,OAAO,GAAG,GAAG,UAAU,GAAG,CAAC;YAEjC,IAAI,OAAO,IAAI,KAAK,WAAW;mBACxB,OAAO,QAAQ,KAAK,WAAW;mBAC/B,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;gBACvC,OAAO;YACX,CAAC;YAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,iCAAiC;gBAClD,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/E,CAAC;YAGD,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnC,OAAO;gBACX,CAAC;gBAED,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC;gBAElC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;oBACpB,OAAO,MAAM,CAAC,QAAQ,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,QAAQ,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;gBAClD,CAAC;gBAED,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;oBACtB,OAAO,MAAM,CAAC,UAAU,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,UAAU,GAAG,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC;gBACxD,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,uCAAuC;QACvC,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAE3B,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC9B,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,IAAI,MAAM,CAAC;QAEX,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACJ,sEAAsE;YACtE,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QACtF,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,UAAU,CAAC;QAE1C,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,MAAM;QACF,MAAM,IAAI,GAAG,EAAE,CAAC;QAEhB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;YAElC,IAAI,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;gBACrB,yCAAyC;gBACzC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,GAAG;oBACpB,KAAK,EAAE,EAAE,CAAC,KAAK;oBACf,SAAS,EAAE,EAAE,CAAC,SAAS;oBACvB,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;iBAC5B,CAAC;YACN,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAED,4CAA4C"}
@@ -0,0 +1,44 @@
1
+ import { Strophe } from 'strophe.js';
2
+ import ConnectionPlugin from './ConnectionPlugin';
3
+ /**
4
+ * Logs raw stanzas and makes them available for download as JSON
5
+ */
6
+ class StropheLogger extends ConnectionPlugin {
7
+ /**
8
+ *
9
+ */
10
+ constructor() {
11
+ super();
12
+ this.log = [];
13
+ }
14
+ /**
15
+ *
16
+ * @param connection
17
+ */
18
+ init(connection) {
19
+ super.init(connection);
20
+ connection.rawInput = this.logIncoming.bind(this);
21
+ connection.rawOutput = this.logOutgoing.bind(this);
22
+ }
23
+ /**
24
+ *
25
+ * @param stanza
26
+ */
27
+ logIncoming(stanza) {
28
+ this.log.push([new Date().getTime(), 'incoming', stanza]);
29
+ }
30
+ /**
31
+ *
32
+ * @param stanza
33
+ */
34
+ logOutgoing(stanza) {
35
+ this.log.push([new Date().getTime(), 'outgoing', stanza]);
36
+ }
37
+ }
38
+ /**
39
+ *
40
+ */
41
+ export default function () {
42
+ Strophe.addConnectionPlugin('logger', new StropheLogger());
43
+ }
44
+ //# sourceMappingURL=strophe.logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strophe.logger.js","sourceRoot":"","sources":["../../../../modules/xmpp/strophe.logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAGlD;;GAEG;AACH,MAAM,aAAc,SAAQ,gBAAgB;IAMxC;;OAEG;IACH;QACI,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;IAClB,CAAC;IAED;;;OAGG;IACM,IAAI,CAAC,UAA8B;QACxC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,MAAiC;QACzC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,CAAE,CAAC,CAAC;IAChE,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,MAAiC;QACzC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,CAAE,CAAC,CAAC;IAChE,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,CAAC,OAAO;IACV,OAAO,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,aAAa,EAAE,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,170 @@
1
+ import { getLogger } from '@jitsi/logger';
2
+ import { $iq, Strophe } from 'strophe.js';
3
+ import ConnectionPlugin from './ConnectionPlugin';
4
+ const logger = getLogger('xmpp:strophe.ping');
5
+ /**
6
+ * Default ping every 10 sec
7
+ */
8
+ const PING_DEFAULT_INTERVAL = 10000;
9
+ /**
10
+ * Default ping timeout error after 5 sec of waiting.
11
+ */
12
+ const PING_DEFAULT_TIMEOUT = 5000;
13
+ /**
14
+ * Default value for how many ping failures will be tolerated before the WebSocket connection is killed.
15
+ * The worst case scenario in case of ping timing out without a response is (25 seconds at the time of this writing):
16
+ * PING_THRESHOLD * PING_INTERVAL + PING_TIMEOUT
17
+ */
18
+ const PING_DEFAULT_THRESHOLD = 2;
19
+ /**
20
+ * XEP-0199 ping plugin.
21
+ *
22
+ * Registers "urn:xmpp:ping" namespace under Strophe.NS.PING.
23
+ */
24
+ export default class PingConnectionPlugin extends ConnectionPlugin {
25
+ /**
26
+ * Constructs new object
27
+ * @param {Object} options
28
+ * @param {Function} options.onPingThresholdExceeded - Callback called when ping fails too many times (controlled
29
+ * by the {@link PING_THRESHOLD} constant).
30
+ * @param {Function} options.getTimeSinceLastServerResponse - A function to obtain the last seen
31
+ * response from the server.
32
+ * @param {Object} options.pingOptions - The ping options if any.
33
+ * @constructor
34
+ */
35
+ constructor({ getTimeSinceLastServerResponse, onPingThresholdExceeded, pingOptions = {} }) {
36
+ super();
37
+ this.failedPings = 0;
38
+ this._onPingThresholdExceeded = onPingThresholdExceeded;
39
+ this._getTimeSinceLastServerResponse = getTimeSinceLastServerResponse;
40
+ this.pingInterval = typeof pingOptions.interval === 'number' ? pingOptions.interval : PING_DEFAULT_INTERVAL;
41
+ this.pingTimeout = typeof pingOptions.timeout === 'number' ? pingOptions.timeout : PING_DEFAULT_TIMEOUT;
42
+ this.pingThreshold = typeof pingOptions.threshold === 'number'
43
+ ? pingOptions.threshold : PING_DEFAULT_THRESHOLD;
44
+ // The number of timestamps of send pings to keep.
45
+ // The current value is 2 minutes.
46
+ this.pingTimestampsToKeep = Math.round(120000 / this.pingInterval);
47
+ this.pingExecIntervals = new Array(this.pingTimestampsToKeep);
48
+ }
49
+ /**
50
+ * Initializes the plugin. Method called by Strophe.
51
+ * @param connection Strophe connection instance.
52
+ */
53
+ init(connection) {
54
+ super.init(connection);
55
+ Strophe.addNamespace('PING', 'urn:xmpp:ping');
56
+ }
57
+ /* eslint-disable max-params */
58
+ /**
59
+ * Sends "ping" to given <tt>jid</tt>
60
+ * @param jid the JID to which ping request will be sent.
61
+ * @param success callback called on success.
62
+ * @param error callback called on error.
63
+ * @param timeout ms how long are we going to wait for the response. On
64
+ * timeout <tt>error<//t> callback is called with undefined error argument.
65
+ */
66
+ ping(jid, success, error, timeout) {
67
+ this._addPingExecutionTimestamp();
68
+ const iq = $iq({
69
+ to: jid,
70
+ type: 'get'
71
+ });
72
+ iq.c('ping', { xmlns: Strophe.NS.PING });
73
+ this.connection.sendIQ2(iq, { timeout })
74
+ .then(success, error);
75
+ }
76
+ /* eslint-enable max-params */
77
+ /**
78
+ * Starts to send ping in given interval to specified remote JID.
79
+ * This plugin supports only one such task and <tt>stopInterval</tt>
80
+ * must be called before starting a new one.
81
+ * @param remoteJid remote JID to which ping requests will be sent to.
82
+ */
83
+ startInterval(remoteJid) {
84
+ clearInterval(this.intervalId);
85
+ this.intervalId = window.setInterval(() => {
86
+ // when there were some server responses in the interval since the last time we checked (_lastServerCheck)
87
+ // let's skip the ping
88
+ const now = Date.now();
89
+ if (this._getTimeSinceLastServerResponse() < now - this._lastServerCheck) {
90
+ // do this just to keep in sync the intervals so we can detect suspended device
91
+ this._addPingExecutionTimestamp();
92
+ this._lastServerCheck = now;
93
+ this.failedPings = 0;
94
+ return;
95
+ }
96
+ this.ping(remoteJid, () => {
97
+ // server response is measured on raw input and ping response time is measured after all the xmpp
98
+ // processing is done in js, so there can be some misalignment when we do the check above.
99
+ // That's why we store the last time we got the response
100
+ this._lastServerCheck = this._getTimeSinceLastServerResponse() + Date.now();
101
+ this.failedPings = 0;
102
+ }, error => {
103
+ this.failedPings += 1;
104
+ const errmsg = `Ping ${error ? 'error' : 'timeout'}`;
105
+ if (this.failedPings >= this.pingThreshold) {
106
+ logger.error(errmsg, error);
107
+ this._onPingThresholdExceeded && this._onPingThresholdExceeded();
108
+ }
109
+ else {
110
+ logger.warn(errmsg, error);
111
+ }
112
+ }, this.pingTimeout);
113
+ }, this.pingInterval);
114
+ logger.info(`XMPP pings will be sent every ${this.pingInterval} ms`);
115
+ }
116
+ /**
117
+ * Stops current "ping" interval task.
118
+ */
119
+ stopInterval() {
120
+ if (this.intervalId) {
121
+ window.clearInterval(this.intervalId);
122
+ this.intervalId = null;
123
+ this.failedPings = 0;
124
+ logger.info('Ping interval cleared');
125
+ }
126
+ }
127
+ /**
128
+ * Adds the current time to the array of send ping timestamps.
129
+ * @private
130
+ */
131
+ _addPingExecutionTimestamp() {
132
+ this.pingExecIntervals.push(new Date().getTime());
133
+ // keep array length to PING_TIMESTAMPS_TO_KEEP
134
+ if (this.pingExecIntervals.length > this.pingTimestampsToKeep) {
135
+ this.pingExecIntervals.shift();
136
+ }
137
+ }
138
+ /**
139
+ * Returns the maximum time between the recent sent pings, if there is a
140
+ * big value it means the computer was inactive for some time(suspended).
141
+ * Checks the maximum gap between sending pings, considering and the
142
+ * current time. Trying to detect computer inactivity (sleep).
143
+ *
144
+ * @returns {int} the time ping was suspended, if it was not 0 is returned.
145
+ */
146
+ getPingSuspendTime() {
147
+ const pingIntervals = this.pingExecIntervals.slice();
148
+ // we need current time, as if ping was sent now
149
+ // if computer sleeps we will get correct interval after next
150
+ // scheduled ping, bet we sometimes need that interval before waiting
151
+ // for the next ping, on closing the connection on error.
152
+ pingIntervals.push(new Date().getTime());
153
+ let maxInterval = 0;
154
+ let previousTS = pingIntervals[0];
155
+ pingIntervals.forEach(e => {
156
+ const currentInterval = e - previousTS;
157
+ if (currentInterval > maxInterval) {
158
+ maxInterval = currentInterval;
159
+ }
160
+ previousTS = e;
161
+ });
162
+ // remove the interval between the ping sent
163
+ // this way in normal execution there is no suspend and the return
164
+ // will be 0 or close to 0.
165
+ maxInterval -= this.pingInterval;
166
+ // make sure we do not return less than 0
167
+ return Math.max(maxInterval, 0);
168
+ }
169
+ }
170
+ //# sourceMappingURL=strophe.ping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strophe.ping.js","sourceRoot":"","sources":["../../../../modules/xmpp/strophe.ping.ts"],"names":[],"mappings":"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"}