@sbhjt-gr/react-native-webrtc 137.0.2

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 (377) hide show
  1. package/.clang-format +11 -0
  2. package/.eslintignore +6 -0
  3. package/.nvmrc +1 -0
  4. package/ISSUE_TEMPLATE.md +40 -0
  5. package/LICENSE +22 -0
  6. package/README.md +82 -0
  7. package/android/build.gradle +36 -0
  8. package/android/consumer-rules.pro +3 -0
  9. package/android/src/main/AndroidManifest.xml +11 -0
  10. package/android/src/main/java/com/oney/WebRTCModule/AbstractVideoCaptureController.java +113 -0
  11. package/android/src/main/java/com/oney/WebRTCModule/CameraCaptureController.java +338 -0
  12. package/android/src/main/java/com/oney/WebRTCModule/CameraEventsHandler.java +49 -0
  13. package/android/src/main/java/com/oney/WebRTCModule/DataChannelWrapper.java +99 -0
  14. package/android/src/main/java/com/oney/WebRTCModule/DataPacketCryptorManager.java +63 -0
  15. package/android/src/main/java/com/oney/WebRTCModule/DisplayUtils.java +16 -0
  16. package/android/src/main/java/com/oney/WebRTCModule/EglUtils.java +66 -0
  17. package/android/src/main/java/com/oney/WebRTCModule/GetUserMediaImpl.java +539 -0
  18. package/android/src/main/java/com/oney/WebRTCModule/LibraryLoader.java +21 -0
  19. package/android/src/main/java/com/oney/WebRTCModule/MediaProjectionNotification.java +70 -0
  20. package/android/src/main/java/com/oney/WebRTCModule/MediaProjectionService.java +82 -0
  21. package/android/src/main/java/com/oney/WebRTCModule/PeerConnectionObserver.java +588 -0
  22. package/android/src/main/java/com/oney/WebRTCModule/RTCCryptoManager.java +493 -0
  23. package/android/src/main/java/com/oney/WebRTCModule/RTCVideoViewManager.java +98 -0
  24. package/android/src/main/java/com/oney/WebRTCModule/ReactBridgeUtil.java +36 -0
  25. package/android/src/main/java/com/oney/WebRTCModule/ScreenCaptureController.java +94 -0
  26. package/android/src/main/java/com/oney/WebRTCModule/SerializeUtils.java +342 -0
  27. package/android/src/main/java/com/oney/WebRTCModule/StringUtils.java +101 -0
  28. package/android/src/main/java/com/oney/WebRTCModule/ThreadUtils.java +41 -0
  29. package/android/src/main/java/com/oney/WebRTCModule/TrackCapturerEventsEmitter.java +34 -0
  30. package/android/src/main/java/com/oney/WebRTCModule/VideoTrackAdapter.java +137 -0
  31. package/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java +1593 -0
  32. package/android/src/main/java/com/oney/WebRTCModule/WebRTCModuleOptions.java +33 -0
  33. package/android/src/main/java/com/oney/WebRTCModule/WebRTCModulePackage.java +21 -0
  34. package/android/src/main/java/com/oney/WebRTCModule/WebRTCView.java +583 -0
  35. package/android/src/main/java/com/oney/WebRTCModule/videoEffects/ProcessorProvider.java +38 -0
  36. package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoEffectProcessor.java +59 -0
  37. package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoFrameProcessor.java +19 -0
  38. package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoFrameProcessorFactoryInterface.java +12 -0
  39. package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/H264AndSoftwareVideoDecoderFactory.java +73 -0
  40. package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/H264AndSoftwareVideoEncoderFactory.java +73 -0
  41. package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/SoftwareVideoDecoderFactoryProxy.java +36 -0
  42. package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/SoftwareVideoEncoderFactoryProxy.java +36 -0
  43. package/android/src/main/java/org/webrtc/Camera1Helper.java +54 -0
  44. package/android/src/main/java/org/webrtc/Camera2Helper.java +52 -0
  45. package/android/src/main/res/values/strings.xml +5 -0
  46. package/android/src/main/res/values/styles.xml +8 -0
  47. package/apple/.placeholder +0 -0
  48. package/ios/RCTWebRTC/CaptureController.h +18 -0
  49. package/ios/RCTWebRTC/CaptureController.m +29 -0
  50. package/ios/RCTWebRTC/CapturerEventsDelegate.h +12 -0
  51. package/ios/RCTWebRTC/DataChannelWrapper.h +27 -0
  52. package/ios/RCTWebRTC/DataChannelWrapper.m +42 -0
  53. package/ios/RCTWebRTC/I420Converter.h +22 -0
  54. package/ios/RCTWebRTC/I420Converter.m +164 -0
  55. package/ios/RCTWebRTC/PIPController.h +24 -0
  56. package/ios/RCTWebRTC/PIPController.m +234 -0
  57. package/ios/RCTWebRTC/RCTConvert+WebRTC.h +16 -0
  58. package/ios/RCTWebRTC/RCTConvert+WebRTC.m +206 -0
  59. package/ios/RCTWebRTC/RTCMediaStreamTrack+React.h +10 -0
  60. package/ios/RCTWebRTC/RTCMediaStreamTrack+React.m +16 -0
  61. package/ios/RCTWebRTC/RTCVideoViewManager.h +29 -0
  62. package/ios/RCTWebRTC/RTCVideoViewManager.m +411 -0
  63. package/ios/RCTWebRTC/SampleBufferVideoCallView.h +12 -0
  64. package/ios/RCTWebRTC/SampleBufferVideoCallView.m +178 -0
  65. package/ios/RCTWebRTC/ScreenCaptureController.h +20 -0
  66. package/ios/RCTWebRTC/ScreenCaptureController.m +83 -0
  67. package/ios/RCTWebRTC/ScreenCapturePickerViewManager.h +7 -0
  68. package/ios/RCTWebRTC/ScreenCapturePickerViewManager.m +60 -0
  69. package/ios/RCTWebRTC/ScreenCapturer.h +19 -0
  70. package/ios/RCTWebRTC/ScreenCapturer.m +264 -0
  71. package/ios/RCTWebRTC/SerializeUtils.h +28 -0
  72. package/ios/RCTWebRTC/SerializeUtils.m +314 -0
  73. package/ios/RCTWebRTC/SocketConnection.h +13 -0
  74. package/ios/RCTWebRTC/SocketConnection.m +137 -0
  75. package/ios/RCTWebRTC/TrackCapturerEventsEmitter.h +14 -0
  76. package/ios/RCTWebRTC/TrackCapturerEventsEmitter.m +37 -0
  77. package/ios/RCTWebRTC/VideoCaptureController.h +21 -0
  78. package/ios/RCTWebRTC/VideoCaptureController.m +328 -0
  79. package/ios/RCTWebRTC/WebRTCModule+Permissions.m +75 -0
  80. package/ios/RCTWebRTC/WebRTCModule+RTCAudioSession.m +20 -0
  81. package/ios/RCTWebRTC/WebRTCModule+RTCDataChannel.h +14 -0
  82. package/ios/RCTWebRTC/WebRTCModule+RTCDataChannel.m +165 -0
  83. package/ios/RCTWebRTC/WebRTCModule+RTCFrameCryptor.m +611 -0
  84. package/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.h +14 -0
  85. package/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m +545 -0
  86. package/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.h +24 -0
  87. package/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.m +1004 -0
  88. package/ios/RCTWebRTC/WebRTCModule+Transceivers.m +267 -0
  89. package/ios/RCTWebRTC/WebRTCModule+VideoTrackAdapter.h +12 -0
  90. package/ios/RCTWebRTC/WebRTCModule+VideoTrackAdapter.m +166 -0
  91. package/ios/RCTWebRTC/WebRTCModule.h +45 -0
  92. package/ios/RCTWebRTC/WebRTCModule.m +149 -0
  93. package/ios/RCTWebRTC/WebRTCModuleOptions.h +24 -0
  94. package/ios/RCTWebRTC/WebRTCModuleOptions.m +31 -0
  95. package/ios/RCTWebRTC/videoEffects/ProcessorProvider.h +9 -0
  96. package/ios/RCTWebRTC/videoEffects/ProcessorProvider.m +23 -0
  97. package/ios/RCTWebRTC/videoEffects/VideoEffectProcessor.h +13 -0
  98. package/ios/RCTWebRTC/videoEffects/VideoEffectProcessor.m +23 -0
  99. package/ios/RCTWebRTC/videoEffects/VideoFrameProcessor.h +8 -0
  100. package/ios/RCTWebRTC.xcodeproj/project.pbxproj +404 -0
  101. package/ios/RCTWebRTC.xcworkspace/contents.xcworkspacedata +10 -0
  102. package/lib/commonjs/Constraints.js +2 -0
  103. package/lib/commonjs/Constraints.js.map +1 -0
  104. package/lib/commonjs/EventEmitter.js +69 -0
  105. package/lib/commonjs/EventEmitter.js.map +1 -0
  106. package/lib/commonjs/Logger.js +47 -0
  107. package/lib/commonjs/Logger.js.map +1 -0
  108. package/lib/commonjs/MediaDevices.js +54 -0
  109. package/lib/commonjs/MediaDevices.js.map +1 -0
  110. package/lib/commonjs/MediaStream.js +137 -0
  111. package/lib/commonjs/MediaStream.js.map +1 -0
  112. package/lib/commonjs/MediaStreamError.js +19 -0
  113. package/lib/commonjs/MediaStreamError.js.map +1 -0
  114. package/lib/commonjs/MediaStreamErrorEvent.js +17 -0
  115. package/lib/commonjs/MediaStreamErrorEvent.js.map +1 -0
  116. package/lib/commonjs/MediaStreamTrack.js +239 -0
  117. package/lib/commonjs/MediaStreamTrack.js.map +1 -0
  118. package/lib/commonjs/MediaStreamTrackEvent.js +26 -0
  119. package/lib/commonjs/MediaStreamTrackEvent.js.map +1 -0
  120. package/lib/commonjs/MessageEvent.js +27 -0
  121. package/lib/commonjs/MessageEvent.js.map +1 -0
  122. package/lib/commonjs/Permissions.js +116 -0
  123. package/lib/commonjs/Permissions.js.map +1 -0
  124. package/lib/commonjs/RTCAudioSession.js +33 -0
  125. package/lib/commonjs/RTCAudioSession.js.map +1 -0
  126. package/lib/commonjs/RTCDataChannel.js +165 -0
  127. package/lib/commonjs/RTCDataChannel.js.map +1 -0
  128. package/lib/commonjs/RTCDataChannelEvent.js +26 -0
  129. package/lib/commonjs/RTCDataChannelEvent.js.map +1 -0
  130. package/lib/commonjs/RTCDataPacketCryptor.js +76 -0
  131. package/lib/commonjs/RTCDataPacketCryptor.js.map +1 -0
  132. package/lib/commonjs/RTCDataPacketCryptorFactory.js +27 -0
  133. package/lib/commonjs/RTCDataPacketCryptorFactory.js.map +1 -0
  134. package/lib/commonjs/RTCErrorEvent.js +23 -0
  135. package/lib/commonjs/RTCErrorEvent.js.map +1 -0
  136. package/lib/commonjs/RTCFrameCryptor.js +138 -0
  137. package/lib/commonjs/RTCFrameCryptor.js.map +1 -0
  138. package/lib/commonjs/RTCFrameCryptorFactory.js +81 -0
  139. package/lib/commonjs/RTCFrameCryptorFactory.js.map +1 -0
  140. package/lib/commonjs/RTCIceCandidate.js +34 -0
  141. package/lib/commonjs/RTCIceCandidate.js.map +1 -0
  142. package/lib/commonjs/RTCIceCandidateEvent.js +28 -0
  143. package/lib/commonjs/RTCIceCandidateEvent.js.map +1 -0
  144. package/lib/commonjs/RTCKeyProvider.js +111 -0
  145. package/lib/commonjs/RTCKeyProvider.js.map +1 -0
  146. package/lib/commonjs/RTCPIPView.js +38 -0
  147. package/lib/commonjs/RTCPIPView.js.map +1 -0
  148. package/lib/commonjs/RTCPeerConnection.js +694 -0
  149. package/lib/commonjs/RTCPeerConnection.js.map +1 -0
  150. package/lib/commonjs/RTCRtcpParameters.js +24 -0
  151. package/lib/commonjs/RTCRtcpParameters.js.map +1 -0
  152. package/lib/commonjs/RTCRtpCapabilities.js +22 -0
  153. package/lib/commonjs/RTCRtpCapabilities.js.map +1 -0
  154. package/lib/commonjs/RTCRtpCodecCapability.js +19 -0
  155. package/lib/commonjs/RTCRtpCodecCapability.js.map +1 -0
  156. package/lib/commonjs/RTCRtpCodecParameters.js +38 -0
  157. package/lib/commonjs/RTCRtpCodecParameters.js.map +1 -0
  158. package/lib/commonjs/RTCRtpEncodingParameters.js +78 -0
  159. package/lib/commonjs/RTCRtpEncodingParameters.js.map +1 -0
  160. package/lib/commonjs/RTCRtpHeaderExtension.js +27 -0
  161. package/lib/commonjs/RTCRtpHeaderExtension.js.map +1 -0
  162. package/lib/commonjs/RTCRtpParameters.js +35 -0
  163. package/lib/commonjs/RTCRtpParameters.js.map +1 -0
  164. package/lib/commonjs/RTCRtpReceiveParameters.js +15 -0
  165. package/lib/commonjs/RTCRtpReceiveParameters.js.map +1 -0
  166. package/lib/commonjs/RTCRtpReceiver.js +53 -0
  167. package/lib/commonjs/RTCRtpReceiver.js.map +1 -0
  168. package/lib/commonjs/RTCRtpSendParameters.js +49 -0
  169. package/lib/commonjs/RTCRtpSendParameters.js.map +1 -0
  170. package/lib/commonjs/RTCRtpSender.js +67 -0
  171. package/lib/commonjs/RTCRtpSender.js.map +1 -0
  172. package/lib/commonjs/RTCRtpTransceiver.js +81 -0
  173. package/lib/commonjs/RTCRtpTransceiver.js.map +1 -0
  174. package/lib/commonjs/RTCSessionDescription.js +33 -0
  175. package/lib/commonjs/RTCSessionDescription.js.map +1 -0
  176. package/lib/commonjs/RTCTrackEvent.js +38 -0
  177. package/lib/commonjs/RTCTrackEvent.js.map +1 -0
  178. package/lib/commonjs/RTCUtil.js +186 -0
  179. package/lib/commonjs/RTCUtil.js.map +1 -0
  180. package/lib/commonjs/RTCView.js +16 -0
  181. package/lib/commonjs/RTCView.js.map +1 -0
  182. package/lib/commonjs/ScreenCapturePickerView.js +10 -0
  183. package/lib/commonjs/ScreenCapturePickerView.js.map +1 -0
  184. package/lib/commonjs/getDisplayMedia.js +33 -0
  185. package/lib/commonjs/getDisplayMedia.js.map +1 -0
  186. package/lib/commonjs/getUserMedia.js +101 -0
  187. package/lib/commonjs/getUserMedia.js.map +1 -0
  188. package/lib/commonjs/index.js +224 -0
  189. package/lib/commonjs/index.js.map +1 -0
  190. package/lib/module/Constraints.js +2 -0
  191. package/lib/module/Constraints.js.map +1 -0
  192. package/lib/module/EventEmitter.js +58 -0
  193. package/lib/module/EventEmitter.js.map +1 -0
  194. package/lib/module/Logger.js +39 -0
  195. package/lib/module/Logger.js.map +1 -0
  196. package/lib/module/MediaDevices.js +46 -0
  197. package/lib/module/MediaDevices.js.map +1 -0
  198. package/lib/module/MediaStream.js +129 -0
  199. package/lib/module/MediaStream.js.map +1 -0
  200. package/lib/module/MediaStreamError.js +12 -0
  201. package/lib/module/MediaStreamError.js.map +1 -0
  202. package/lib/module/MediaStreamErrorEvent.js +10 -0
  203. package/lib/module/MediaStreamErrorEvent.js.map +1 -0
  204. package/lib/module/MediaStreamTrack.js +231 -0
  205. package/lib/module/MediaStreamTrack.js.map +1 -0
  206. package/lib/module/MediaStreamTrackEvent.js +19 -0
  207. package/lib/module/MediaStreamTrackEvent.js.map +1 -0
  208. package/lib/module/MessageEvent.js +20 -0
  209. package/lib/module/MessageEvent.js.map +1 -0
  210. package/lib/module/Permissions.js +109 -0
  211. package/lib/module/Permissions.js.map +1 -0
  212. package/lib/module/RTCAudioSession.js +26 -0
  213. package/lib/module/RTCAudioSession.js.map +1 -0
  214. package/lib/module/RTCDataChannel.js +155 -0
  215. package/lib/module/RTCDataChannel.js.map +1 -0
  216. package/lib/module/RTCDataChannelEvent.js +19 -0
  217. package/lib/module/RTCDataChannelEvent.js.map +1 -0
  218. package/lib/module/RTCDataPacketCryptor.js +66 -0
  219. package/lib/module/RTCDataPacketCryptor.js.map +1 -0
  220. package/lib/module/RTCDataPacketCryptorFactory.js +19 -0
  221. package/lib/module/RTCDataPacketCryptorFactory.js.map +1 -0
  222. package/lib/module/RTCErrorEvent.js +16 -0
  223. package/lib/module/RTCErrorEvent.js.map +1 -0
  224. package/lib/module/RTCFrameCryptor.js +128 -0
  225. package/lib/module/RTCFrameCryptor.js.map +1 -0
  226. package/lib/module/RTCFrameCryptorFactory.js +70 -0
  227. package/lib/module/RTCFrameCryptorFactory.js.map +1 -0
  228. package/lib/module/RTCIceCandidate.js +27 -0
  229. package/lib/module/RTCIceCandidate.js.map +1 -0
  230. package/lib/module/RTCIceCandidateEvent.js +21 -0
  231. package/lib/module/RTCIceCandidateEvent.js.map +1 -0
  232. package/lib/module/RTCKeyProvider.js +101 -0
  233. package/lib/module/RTCKeyProvider.js.map +1 -0
  234. package/lib/module/RTCPIPView.js +26 -0
  235. package/lib/module/RTCPIPView.js.map +1 -0
  236. package/lib/module/RTCPeerConnection.js +684 -0
  237. package/lib/module/RTCPeerConnection.js.map +1 -0
  238. package/lib/module/RTCRtcpParameters.js +17 -0
  239. package/lib/module/RTCRtcpParameters.js.map +1 -0
  240. package/lib/module/RTCRtpCapabilities.js +15 -0
  241. package/lib/module/RTCRtpCapabilities.js.map +1 -0
  242. package/lib/module/RTCRtpCodecCapability.js +12 -0
  243. package/lib/module/RTCRtpCodecCapability.js.map +1 -0
  244. package/lib/module/RTCRtpCodecParameters.js +31 -0
  245. package/lib/module/RTCRtpCodecParameters.js.map +1 -0
  246. package/lib/module/RTCRtpEncodingParameters.js +71 -0
  247. package/lib/module/RTCRtpEncodingParameters.js.map +1 -0
  248. package/lib/module/RTCRtpHeaderExtension.js +20 -0
  249. package/lib/module/RTCRtpHeaderExtension.js.map +1 -0
  250. package/lib/module/RTCRtpParameters.js +27 -0
  251. package/lib/module/RTCRtpParameters.js.map +1 -0
  252. package/lib/module/RTCRtpReceiveParameters.js +7 -0
  253. package/lib/module/RTCRtpReceiveParameters.js.map +1 -0
  254. package/lib/module/RTCRtpReceiver.js +45 -0
  255. package/lib/module/RTCRtpReceiver.js.map +1 -0
  256. package/lib/module/RTCRtpSendParameters.js +41 -0
  257. package/lib/module/RTCRtpSendParameters.js.map +1 -0
  258. package/lib/module/RTCRtpSender.js +59 -0
  259. package/lib/module/RTCRtpSender.js.map +1 -0
  260. package/lib/module/RTCRtpTransceiver.js +74 -0
  261. package/lib/module/RTCRtpTransceiver.js.map +1 -0
  262. package/lib/module/RTCSessionDescription.js +26 -0
  263. package/lib/module/RTCSessionDescription.js.map +1 -0
  264. package/lib/module/RTCTrackEvent.js +31 -0
  265. package/lib/module/RTCTrackEvent.js.map +1 -0
  266. package/lib/module/RTCUtil.js +176 -0
  267. package/lib/module/RTCUtil.js.map +1 -0
  268. package/lib/module/RTCView.js +11 -0
  269. package/lib/module/RTCView.js.map +1 -0
  270. package/lib/module/ScreenCapturePickerView.js +3 -0
  271. package/lib/module/ScreenCapturePickerView.js.map +1 -0
  272. package/lib/module/getDisplayMedia.js +26 -0
  273. package/lib/module/getDisplayMedia.js.map +1 -0
  274. package/lib/module/getUserMedia.js +92 -0
  275. package/lib/module/getUserMedia.js.map +1 -0
  276. package/lib/module/index.js +60 -0
  277. package/lib/module/index.js.map +1 -0
  278. package/lib/typescript/Constraints.d.ts +19 -0
  279. package/lib/typescript/EventEmitter.d.ts +7 -0
  280. package/lib/typescript/Logger.d.ts +13 -0
  281. package/lib/typescript/MediaDevices.d.ts +30 -0
  282. package/lib/typescript/MediaStream.d.ts +48 -0
  283. package/lib/typescript/MediaStreamError.d.ts +6 -0
  284. package/lib/typescript/MediaStreamErrorEvent.d.ts +6 -0
  285. package/lib/typescript/MediaStreamTrack.d.ts +103 -0
  286. package/lib/typescript/MediaStreamTrackEvent.d.ts +19 -0
  287. package/lib/typescript/MessageEvent.d.ts +21 -0
  288. package/lib/typescript/Permissions.d.ts +55 -0
  289. package/lib/typescript/RTCAudioSession.d.ts +10 -0
  290. package/lib/typescript/RTCDataChannel.d.ts +43 -0
  291. package/lib/typescript/RTCDataChannelEvent.d.ts +19 -0
  292. package/lib/typescript/RTCDataPacketCryptor.d.ts +12 -0
  293. package/lib/typescript/RTCDataPacketCryptorFactory.d.ts +6 -0
  294. package/lib/typescript/RTCErrorEvent.d.ts +12 -0
  295. package/lib/typescript/RTCFrameCryptor.d.ts +47 -0
  296. package/lib/typescript/RTCFrameCryptorFactory.d.ts +21 -0
  297. package/lib/typescript/RTCIceCandidate.d.ts +17 -0
  298. package/lib/typescript/RTCIceCandidateEvent.d.ts +20 -0
  299. package/lib/typescript/RTCKeyProvider.d.ts +21 -0
  300. package/lib/typescript/RTCPIPView.d.ts +15 -0
  301. package/lib/typescript/RTCPeerConnection.d.ts +117 -0
  302. package/lib/typescript/RTCRtcpParameters.d.ts +10 -0
  303. package/lib/typescript/RTCRtpCapabilities.d.ts +9 -0
  304. package/lib/typescript/RTCRtpCodecCapability.d.ts +7 -0
  305. package/lib/typescript/RTCRtpCodecParameters.d.ts +16 -0
  306. package/lib/typescript/RTCRtpEncodingParameters.d.ts +23 -0
  307. package/lib/typescript/RTCRtpHeaderExtension.d.ts +12 -0
  308. package/lib/typescript/RTCRtpParameters.d.ts +19 -0
  309. package/lib/typescript/RTCRtpReceiveParameters.d.ts +4 -0
  310. package/lib/typescript/RTCRtpReceiver.d.ts +21 -0
  311. package/lib/typescript/RTCRtpSendParameters.d.ts +20 -0
  312. package/lib/typescript/RTCRtpSender.d.ts +22 -0
  313. package/lib/typescript/RTCRtpTransceiver.d.ts +31 -0
  314. package/lib/typescript/RTCSessionDescription.d.ts +12 -0
  315. package/lib/typescript/RTCTrackEvent.d.ts +29 -0
  316. package/lib/typescript/RTCUtil.d.ts +37 -0
  317. package/lib/typescript/RTCView.d.ts +117 -0
  318. package/lib/typescript/ScreenCapturePickerView.d.ts +2 -0
  319. package/lib/typescript/getDisplayMedia.d.ts +2 -0
  320. package/lib/typescript/getUserMedia.d.ts +7 -0
  321. package/lib/typescript/index.d.ts +22 -0
  322. package/livekit-react-native-webrtc.podspec +29 -0
  323. package/macos/RCTWebRTC.xcodeproj/project.pbxproj +324 -0
  324. package/macos/RCTWebRTC.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  325. package/macos/RCTWebRTC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  326. package/metro.config.js +7 -0
  327. package/metro.config.macos.js +14 -0
  328. package/package.json +65 -0
  329. package/react-native.config.js +11 -0
  330. package/src/.eslintrc.cjs +67 -0
  331. package/src/Constraints.ts +21 -0
  332. package/src/EventEmitter.ts +83 -0
  333. package/src/Logger.ts +49 -0
  334. package/src/MediaDevices.ts +53 -0
  335. package/src/MediaStream.ts +161 -0
  336. package/src/MediaStreamError.ts +12 -0
  337. package/src/MediaStreamErrorEvent.ts +11 -0
  338. package/src/MediaStreamTrack.ts +331 -0
  339. package/src/MediaStreamTrackEvent.ts +25 -0
  340. package/src/MessageEvent.ts +26 -0
  341. package/src/Permissions.ts +133 -0
  342. package/src/RTCAudioSession.ts +25 -0
  343. package/src/RTCDataChannel.ts +190 -0
  344. package/src/RTCDataChannelEvent.ts +28 -0
  345. package/src/RTCDataPacketCryptor.ts +90 -0
  346. package/src/RTCDataPacketCryptorFactory.ts +25 -0
  347. package/src/RTCErrorEvent.ts +21 -0
  348. package/src/RTCFrameCryptor.ts +163 -0
  349. package/src/RTCFrameCryptorFactory.ts +102 -0
  350. package/src/RTCIceCandidate.ts +29 -0
  351. package/src/RTCIceCandidateEvent.ts +26 -0
  352. package/src/RTCKeyProvider.ts +117 -0
  353. package/src/RTCPIPView.tsx +47 -0
  354. package/src/RTCPeerConnection.ts +832 -0
  355. package/src/RTCRtcpParameters.ts +23 -0
  356. package/src/RTCRtpCapabilities.ts +16 -0
  357. package/src/RTCRtpCodecCapability.ts +13 -0
  358. package/src/RTCRtpCodecParameters.ts +44 -0
  359. package/src/RTCRtpEncodingParameters.ts +90 -0
  360. package/src/RTCRtpHeaderExtension.ts +27 -0
  361. package/src/RTCRtpParameters.ts +37 -0
  362. package/src/RTCRtpReceiveParameters.ts +7 -0
  363. package/src/RTCRtpReceiver.ts +60 -0
  364. package/src/RTCRtpSendParameters.ts +63 -0
  365. package/src/RTCRtpSender.ts +78 -0
  366. package/src/RTCRtpTransceiver.ts +107 -0
  367. package/src/RTCSessionDescription.ts +30 -0
  368. package/src/RTCTrackEvent.ts +42 -0
  369. package/src/RTCUtil.ts +211 -0
  370. package/src/RTCView.ts +122 -0
  371. package/src/ScreenCapturePickerView.ts +4 -0
  372. package/src/getDisplayMedia.ts +30 -0
  373. package/src/getUserMedia.ts +111 -0
  374. package/src/index.ts +101 -0
  375. package/tools/format.sh +6 -0
  376. package/tools/release.sh +45 -0
  377. package/tsconfig.json +16 -0
@@ -0,0 +1,694 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _index = require("event-target-shim/index");
8
+ var _reactNative = require("react-native");
9
+ var _EventEmitter = require("./EventEmitter");
10
+ var _Logger = _interopRequireDefault(require("./Logger"));
11
+ var _MediaStream = _interopRequireDefault(require("./MediaStream"));
12
+ var _MediaStreamTrack = _interopRequireDefault(require("./MediaStreamTrack"));
13
+ var _MediaStreamTrackEvent = _interopRequireDefault(require("./MediaStreamTrackEvent"));
14
+ var _RTCDataChannel = _interopRequireDefault(require("./RTCDataChannel"));
15
+ var _RTCDataChannelEvent = _interopRequireDefault(require("./RTCDataChannelEvent"));
16
+ var _RTCIceCandidate = _interopRequireDefault(require("./RTCIceCandidate"));
17
+ var _RTCIceCandidateEvent = _interopRequireDefault(require("./RTCIceCandidateEvent"));
18
+ var _RTCRtpReceiveParameters = _interopRequireDefault(require("./RTCRtpReceiveParameters"));
19
+ var _RTCRtpReceiver = _interopRequireDefault(require("./RTCRtpReceiver"));
20
+ var _RTCRtpSendParameters = _interopRequireDefault(require("./RTCRtpSendParameters"));
21
+ var _RTCRtpSender = _interopRequireDefault(require("./RTCRtpSender"));
22
+ var _RTCRtpTransceiver = _interopRequireDefault(require("./RTCRtpTransceiver"));
23
+ var _RTCSessionDescription = _interopRequireDefault(require("./RTCSessionDescription"));
24
+ var _RTCTrackEvent = _interopRequireDefault(require("./RTCTrackEvent"));
25
+ var RTCUtil = _interopRequireWildcard(require("./RTCUtil"));
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
30
+ const log = new _Logger.default('pc');
31
+ const {
32
+ WebRTCModule
33
+ } = _reactNative.NativeModules;
34
+ let nextPeerConnectionId = 0;
35
+ class RTCPeerConnection extends _index.EventTarget {
36
+ constructor(configuration) {
37
+ super();
38
+ _defineProperty(this, "localDescription", null);
39
+ _defineProperty(this, "remoteDescription", null);
40
+ _defineProperty(this, "signalingState", 'stable');
41
+ _defineProperty(this, "iceGatheringState", 'new');
42
+ _defineProperty(this, "connectionState", 'new');
43
+ _defineProperty(this, "iceConnectionState", 'new');
44
+ _defineProperty(this, "_pcId", void 0);
45
+ _defineProperty(this, "_transceivers", void 0);
46
+ _defineProperty(this, "_remoteStreams", void 0);
47
+ _defineProperty(this, "_pendingTrackEvents", void 0);
48
+ this._pcId = nextPeerConnectionId++;
49
+
50
+ // Sanitize ICE servers.
51
+ if (configuration) {
52
+ var _configuration$iceSer;
53
+ const servers = (_configuration$iceSer = configuration === null || configuration === void 0 ? void 0 : configuration.iceServers) !== null && _configuration$iceSer !== void 0 ? _configuration$iceSer : [];
54
+ for (const server of servers) {
55
+ let urls = server.url || server.urls;
56
+ delete server.url;
57
+ delete server.urls;
58
+ if (!urls) {
59
+ continue;
60
+ }
61
+ if (!Array.isArray(urls)) {
62
+ urls = [urls];
63
+ }
64
+
65
+ // Native WebRTC does case sensitive parsing.
66
+ server.urls = urls.map(url => url.toLowerCase());
67
+ }
68
+
69
+ // Filter out bogus servers.
70
+ configuration.iceServers = servers.filter(s => s.urls);
71
+ }
72
+ if (!WebRTCModule.peerConnectionInit(configuration, this._pcId)) {
73
+ throw new Error('Failed to initialize PeerConnection, check the native logs!');
74
+ }
75
+ this._transceivers = [];
76
+ this._remoteStreams = new Map();
77
+ this._pendingTrackEvents = [];
78
+ this._registerEvents();
79
+ log.debug(`${this._pcId} ctor`);
80
+ }
81
+ async createOffer(options) {
82
+ log.debug(`${this._pcId} createOffer`);
83
+ const {
84
+ sdpInfo,
85
+ newTransceivers,
86
+ transceiversInfo
87
+ } = await WebRTCModule.peerConnectionCreateOffer(this._pcId, RTCUtil.normalizeOfferOptions(options));
88
+ log.debug(`${this._pcId} createOffer OK`);
89
+ newTransceivers === null || newTransceivers === void 0 ? void 0 : newTransceivers.forEach(t => {
90
+ const {
91
+ transceiverOrder,
92
+ transceiver
93
+ } = t;
94
+ const newSender = new _RTCRtpSender.default({
95
+ ...transceiver.sender,
96
+ track: null
97
+ });
98
+ const remoteTrack = transceiver.receiver.track ? new _MediaStreamTrack.default(transceiver.receiver.track) : null;
99
+ const newReceiver = new _RTCRtpReceiver.default({
100
+ ...transceiver.receiver,
101
+ track: remoteTrack
102
+ });
103
+ const newTransceiver = new _RTCRtpTransceiver.default({
104
+ ...transceiver,
105
+ sender: newSender,
106
+ receiver: newReceiver
107
+ });
108
+ this._insertTransceiverSorted(transceiverOrder, newTransceiver);
109
+ });
110
+ this._updateTransceivers(transceiversInfo);
111
+ return sdpInfo;
112
+ }
113
+ async createAnswer() {
114
+ log.debug(`${this._pcId} createAnswer`);
115
+ const {
116
+ sdpInfo,
117
+ transceiversInfo
118
+ } = await WebRTCModule.peerConnectionCreateAnswer(this._pcId, {});
119
+ this._updateTransceivers(transceiversInfo);
120
+ return sdpInfo;
121
+ }
122
+ setConfiguration(configuration) {
123
+ WebRTCModule.peerConnectionSetConfiguration(configuration, this._pcId);
124
+ }
125
+ async setLocalDescription(sessionDescription) {
126
+ var _desc;
127
+ log.debug(`${this._pcId} setLocalDescription`);
128
+ let desc;
129
+ if (sessionDescription) {
130
+ var _sessionDescription$s;
131
+ desc = {
132
+ type: sessionDescription.type,
133
+ sdp: (_sessionDescription$s = sessionDescription.sdp) !== null && _sessionDescription$s !== void 0 ? _sessionDescription$s : ''
134
+ };
135
+ if (!RTCUtil.isSdpTypeValid(desc.type)) {
136
+ throw new Error(`Invalid session description: invalid type: ${desc.type}`);
137
+ }
138
+ } else {
139
+ desc = null;
140
+ }
141
+ const {
142
+ sdpInfo,
143
+ transceiversInfo
144
+ } = await WebRTCModule.peerConnectionSetLocalDescription(this._pcId, desc);
145
+ if (sdpInfo.type && sdpInfo.sdp) {
146
+ this.localDescription = new _RTCSessionDescription.default(sdpInfo);
147
+ } else {
148
+ this.localDescription = null;
149
+ }
150
+ this._updateTransceivers(transceiversInfo, /* removeStopped */((_desc = desc) === null || _desc === void 0 ? void 0 : _desc.type) === 'answer');
151
+ log.debug(`${this._pcId} setLocalDescription OK`);
152
+ }
153
+ async setRemoteDescription(sessionDescription) {
154
+ var _sessionDescription$s2, _desc$type;
155
+ log.debug(`${this._pcId} setRemoteDescription`);
156
+ if (!sessionDescription) {
157
+ return Promise.reject(new Error('No session description provided'));
158
+ }
159
+ const desc = {
160
+ type: sessionDescription.type,
161
+ sdp: (_sessionDescription$s2 = sessionDescription.sdp) !== null && _sessionDescription$s2 !== void 0 ? _sessionDescription$s2 : ''
162
+ };
163
+ if (!RTCUtil.isSdpTypeValid((_desc$type = desc.type) !== null && _desc$type !== void 0 ? _desc$type : '')) {
164
+ throw new Error(`Invalid session description: invalid type: ${desc.type}`);
165
+ }
166
+ const {
167
+ sdpInfo,
168
+ newTransceivers,
169
+ transceiversInfo
170
+ } = await WebRTCModule.peerConnectionSetRemoteDescription(this._pcId, desc);
171
+ if (sdpInfo.type && sdpInfo.sdp) {
172
+ this.remoteDescription = new _RTCSessionDescription.default(sdpInfo);
173
+ } else {
174
+ this.remoteDescription = null;
175
+ }
176
+ newTransceivers === null || newTransceivers === void 0 ? void 0 : newTransceivers.forEach(t => {
177
+ const {
178
+ transceiverOrder,
179
+ transceiver
180
+ } = t;
181
+ const newSender = new _RTCRtpSender.default({
182
+ ...transceiver.sender,
183
+ track: null
184
+ });
185
+ const remoteTrack = transceiver.receiver.track ? new _MediaStreamTrack.default(transceiver.receiver.track) : null;
186
+ const newReceiver = new _RTCRtpReceiver.default({
187
+ ...transceiver.receiver,
188
+ track: remoteTrack
189
+ });
190
+ const newTransceiver = new _RTCRtpTransceiver.default({
191
+ ...transceiver,
192
+ sender: newSender,
193
+ receiver: newReceiver
194
+ });
195
+ this._insertTransceiverSorted(transceiverOrder, newTransceiver);
196
+ });
197
+ this._updateTransceivers(transceiversInfo, /* removeStopped */desc.type === 'answer');
198
+
199
+ // Fire track events. They must fire before sRD resolves.
200
+ const pendingTrackEvents = this._pendingTrackEvents;
201
+ this._pendingTrackEvents = [];
202
+ for (const ev of pendingTrackEvents) {
203
+ const [transceiver] = this.getTransceivers().filter(t => t.receiver.id === ev.receiver.id);
204
+
205
+ // We need to fire this event for an existing track sometimes, like
206
+ // when the transceiver direction (on the sending side) switches from
207
+ // sendrecv to recvonly and then back.
208
+
209
+ // @ts-ignore
210
+ const track = transceiver.receiver.track;
211
+ transceiver._mid = ev.transceiver.mid;
212
+ transceiver._currentDirection = ev.transceiver.currentDirection;
213
+ transceiver._direction = ev.transceiver.direction;
214
+
215
+ // Get the stream object from the event. Create if necessary.
216
+ const streams = ev.streams.map(streamInfo => {
217
+ // Here we are making sure that we don't create stream objects that already exist
218
+ // So that event listeners do get the same object if it has been created before.
219
+ if (!this._remoteStreams.has(streamInfo.streamId)) {
220
+ const stream = new _MediaStream.default({
221
+ streamId: streamInfo.streamId,
222
+ streamReactTag: streamInfo.streamReactTag,
223
+ tracks: []
224
+ });
225
+ this._remoteStreams.set(streamInfo.streamId, stream);
226
+ }
227
+ const stream = this._remoteStreams.get(streamInfo.streamId);
228
+ if (!(stream !== null && stream !== void 0 && stream._tracks.includes(track))) {
229
+ stream === null || stream === void 0 ? void 0 : stream._tracks.push(track);
230
+ }
231
+ return stream;
232
+ });
233
+ const eventData = {
234
+ streams,
235
+ transceiver,
236
+ track,
237
+ receiver: transceiver.receiver
238
+ };
239
+ this.dispatchEvent(new _RTCTrackEvent.default('track', eventData));
240
+ streams.forEach(stream => {
241
+ stream.dispatchEvent(new _MediaStreamTrackEvent.default('addtrack', {
242
+ track
243
+ }));
244
+ });
245
+
246
+ // Dispatch an unmute event for the track.
247
+ track._setMutedInternal(false);
248
+ }
249
+ log.debug(`${this._pcId} setRemoteDescription OK`);
250
+ }
251
+ async addIceCandidate(candidate) {
252
+ log.debug(`${this._pcId} addIceCandidate`);
253
+ if (!candidate || !candidate.candidate) {
254
+ // XXX end-of candidates is not implemented: https://bugs.chromium.org/p/webrtc/issues/detail?id=9218
255
+ return;
256
+ }
257
+ if ((candidate.sdpMLineIndex === null || candidate.sdpMLineIndex === undefined) && (candidate.sdpMid === null || candidate.sdpMid === undefined)) {
258
+ throw new TypeError('`sdpMLineIndex` and `sdpMid` must not be both null or undefined');
259
+ }
260
+ const newSdp = await WebRTCModule.peerConnectionAddICECandidate(this._pcId, RTCUtil.deepClone(candidate));
261
+ this.remoteDescription = new _RTCSessionDescription.default(newSdp);
262
+ }
263
+
264
+ /**
265
+ * @brief Adds a new track to the {@link RTCPeerConnection},
266
+ * and indicates that it is contained in the specified {@link MediaStream}s.
267
+ * This method has to be synchronous as the W3C API expects a track to be returned
268
+ * @param {MediaStreamTrack} track The track to be added
269
+ * @param {...MediaStream} streams One or more {@link MediaStream}s the track needs to be added to
270
+ * https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-addtrack
271
+ */
272
+ addTrack(track) {
273
+ log.debug(`${this._pcId} addTrack`);
274
+ if (this.connectionState === 'closed') {
275
+ throw new Error('Peer Connection is closed');
276
+ }
277
+ if (this._trackExists(track)) {
278
+ throw new Error('Track already exists in a sender');
279
+ }
280
+ for (var _len = arguments.length, streams = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
281
+ streams[_key - 1] = arguments[_key];
282
+ }
283
+ const streamIds = streams.map(s => s.id);
284
+ const result = WebRTCModule.peerConnectionAddTrack(this._pcId, track.id, {
285
+ streamIds
286
+ });
287
+ if (result === null) {
288
+ throw new Error('Could not add sender');
289
+ }
290
+ const {
291
+ transceiverOrder,
292
+ transceiver,
293
+ sender
294
+ } = result;
295
+
296
+ // According to the W3C docs, the sender could have been reused, and
297
+ // so we check if that is the case, and update accordingly.
298
+ const [existingSender] = this.getSenders().filter(s => s.id === sender.id);
299
+ if (existingSender) {
300
+ // Update sender
301
+ existingSender._track = track;
302
+
303
+ // Update the corresponding transceiver as well
304
+ const [existingTransceiver] = this.getTransceivers().filter(t => t.sender.id === existingSender.id);
305
+ existingTransceiver._direction = transceiver.direction;
306
+ existingTransceiver._currentDirection = transceiver.currentDirection;
307
+ return existingSender;
308
+ }
309
+
310
+ // This is a new transceiver, should create a transceiver for it and add it
311
+ const newSender = new _RTCRtpSender.default({
312
+ ...transceiver.sender,
313
+ track
314
+ });
315
+ const remoteTrack = transceiver.receiver.track ? new _MediaStreamTrack.default(transceiver.receiver.track) : null;
316
+ const newReceiver = new _RTCRtpReceiver.default({
317
+ ...transceiver.receiver,
318
+ track: remoteTrack
319
+ });
320
+ const newTransceiver = new _RTCRtpTransceiver.default({
321
+ ...transceiver,
322
+ sender: newSender,
323
+ receiver: newReceiver
324
+ });
325
+ this._insertTransceiverSorted(transceiverOrder, newTransceiver);
326
+ return newSender;
327
+ }
328
+ addTransceiver(source, init) {
329
+ log.debug(`${this._pcId} addTransceiver`);
330
+ let src = {};
331
+ if (source === 'audio') {
332
+ src = {
333
+ type: 'audio'
334
+ };
335
+ } else if (source === 'video') {
336
+ src = {
337
+ type: 'video'
338
+ };
339
+ } else {
340
+ src = {
341
+ trackId: source.id
342
+ };
343
+ }
344
+
345
+ // Extract the stream ids
346
+ if (init && init.streams) {
347
+ init.streamIds = init.streams.map(stream => stream.id);
348
+ }
349
+ const result = WebRTCModule.peerConnectionAddTransceiver(this._pcId, {
350
+ ...src,
351
+ init: {
352
+ ...init
353
+ }
354
+ });
355
+ if (result === null) {
356
+ throw new Error('Transceiver could not be added');
357
+ }
358
+ const t = result.transceiver;
359
+ let track = null;
360
+ if (typeof source === 'string') {
361
+ if (t.sender.track) {
362
+ track = new _MediaStreamTrack.default(t.sender.track);
363
+ }
364
+ } else {
365
+ // 'source' is a MediaStreamTrack
366
+ track = source;
367
+ }
368
+ const sender = new _RTCRtpSender.default({
369
+ ...t.sender,
370
+ track
371
+ });
372
+ const remoteTrack = t.receiver.track ? new _MediaStreamTrack.default(t.receiver.track) : null;
373
+ const receiver = new _RTCRtpReceiver.default({
374
+ ...t.receiver,
375
+ track: remoteTrack
376
+ });
377
+ const transceiver = new _RTCRtpTransceiver.default({
378
+ ...result.transceiver,
379
+ sender,
380
+ receiver
381
+ });
382
+ this._insertTransceiverSorted(result.transceiverOrder, transceiver);
383
+ return transceiver;
384
+ }
385
+ removeTrack(sender) {
386
+ log.debug(`${this._pcId} removeTrack`);
387
+ if (this._pcId !== sender._peerConnectionId) {
388
+ throw new Error('Sender does not belong to this peer connection');
389
+ }
390
+ if (this.connectionState === 'closed') {
391
+ throw new Error('Peer Connection is closed');
392
+ }
393
+ const existingSender = this.getSenders().find(s => s === sender);
394
+ if (!existingSender) {
395
+ throw new Error('Sender does not exist');
396
+ }
397
+ if (existingSender.track === null) {
398
+ return;
399
+ }
400
+
401
+ // Blocking!
402
+ WebRTCModule.peerConnectionRemoveTrack(this._pcId, sender.id);
403
+ existingSender._track = null;
404
+ const [existingTransceiver] = this.getTransceivers().filter(t => t.sender.id === existingSender.id);
405
+ existingTransceiver._direction = existingTransceiver.direction === 'sendrecv' ? 'recvonly' : 'inactive';
406
+ }
407
+ async getStats(selector) {
408
+ log.debug(`${this._pcId} getStats`);
409
+ if (!selector) {
410
+ const data = await WebRTCModule.peerConnectionGetStats(this._pcId);
411
+
412
+ /**
413
+ * On both Android and iOS it is faster to construct a single
414
+ * JSON string representing the Map of StatsReports and have it
415
+ * pass through the React Native bridge rather than the Map of
416
+ * StatsReports. While the implementations do try to be faster in
417
+ * general, the stress is on being faster to pass through the React
418
+ * Native bridge which is a bottleneck that tends to be visible in
419
+ * the UI when there is congestion involving UI-related passing.
420
+ */
421
+ return new Map(JSON.parse(data));
422
+ } else {
423
+ const senders = this.getSenders().filter(s => s.track === selector);
424
+ const receivers = this.getReceivers().filter(r => r.track === selector);
425
+ const matches = senders.length + receivers.length;
426
+ if (matches === 0) {
427
+ throw new Error('Invalid selector: could not find matching sender / receiver');
428
+ } else if (matches > 1) {
429
+ throw new Error('Invalid selector: multiple matching senders / receivers');
430
+ } else {
431
+ const sr = senders[0] || receivers[0];
432
+ return sr.getStats();
433
+ }
434
+ }
435
+ }
436
+ getTransceivers() {
437
+ return this._transceivers.map(e => e.transceiver);
438
+ }
439
+ getSenders() {
440
+ return this._transceivers.filter(e => !e.transceiver.stopped).map(e => e.transceiver.sender);
441
+ }
442
+ getReceivers() {
443
+ return this._transceivers.filter(e => !e.transceiver.stopped).map(e => e.transceiver.receiver);
444
+ }
445
+ close() {
446
+ log.debug(`${this._pcId} close`);
447
+ if (this.connectionState === 'closed') {
448
+ return;
449
+ }
450
+ WebRTCModule.peerConnectionClose(this._pcId);
451
+
452
+ // Mark transceivers as stopped.
453
+ this._transceivers.forEach(_ref => {
454
+ let {
455
+ transceiver
456
+ } = _ref;
457
+ transceiver._setStopped();
458
+ });
459
+ }
460
+ restartIce() {
461
+ WebRTCModule.peerConnectionRestartIce(this._pcId);
462
+ }
463
+ _registerEvents() {
464
+ (0, _EventEmitter.addListener)(this, 'peerConnectionOnRenegotiationNeeded', ev => {
465
+ if (ev.pcId !== this._pcId) {
466
+ return;
467
+ }
468
+ this.dispatchEvent(new _index.Event('negotiationneeded'));
469
+ });
470
+ (0, _EventEmitter.addListener)(this, 'peerConnectionIceConnectionChanged', ev => {
471
+ if (ev.pcId !== this._pcId) {
472
+ return;
473
+ }
474
+ this.iceConnectionState = ev.iceConnectionState;
475
+ this.dispatchEvent(new _index.Event('iceconnectionstatechange'));
476
+ });
477
+ (0, _EventEmitter.addListener)(this, 'peerConnectionStateChanged', ev => {
478
+ if (ev.pcId !== this._pcId) {
479
+ return;
480
+ }
481
+ this.connectionState = ev.connectionState;
482
+ this.dispatchEvent(new _index.Event('connectionstatechange'));
483
+ if (ev.connectionState === 'closed') {
484
+ // This PeerConnection is done, clean up.
485
+ (0, _EventEmitter.removeListener)(this);
486
+ WebRTCModule.peerConnectionDispose(this._pcId);
487
+ }
488
+ });
489
+ (0, _EventEmitter.addListener)(this, 'peerConnectionSignalingStateChanged', ev => {
490
+ if (ev.pcId !== this._pcId) {
491
+ return;
492
+ }
493
+ this.signalingState = ev.signalingState;
494
+ this.dispatchEvent(new _index.Event('signalingstatechange'));
495
+ });
496
+
497
+ // Consider moving away from this event: https://github.com/WebKit/WebKit/pull/3953
498
+ (0, _EventEmitter.addListener)(this, 'peerConnectionOnTrack', ev => {
499
+ if (ev.pcId !== this._pcId) {
500
+ return;
501
+ }
502
+ log.debug(`${this._pcId} ontrack`);
503
+
504
+ // NOTE: We need to make sure the track event fires right before sRD completes,
505
+ // so we queue them up here and dispatch the events when sRD fires, but before completing it.
506
+ // In the future we should probably implement out own logic and drop this event altogether.
507
+ this._pendingTrackEvents.push(ev);
508
+ });
509
+ (0, _EventEmitter.addListener)(this, 'peerConnectionOnRemoveTrack', ev => {
510
+ if (ev.pcId !== this._pcId) {
511
+ return;
512
+ }
513
+ log.debug(`${this._pcId} onremovetrack ${ev.receiverId}`);
514
+ const receiver = this.getReceivers().find(r => r.id === ev.receiverId);
515
+ const track = receiver === null || receiver === void 0 ? void 0 : receiver.track;
516
+ if (receiver && track) {
517
+ // As per the spec:
518
+ // - Remove the track from any media streams that were previously passed to the `track` event.
519
+ // https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-removetrack,
520
+ // - Mark the track as muted:
521
+ // https://w3c.github.io/webrtc-pc/#process-remote-track-removal
522
+ for (const stream of this._remoteStreams.values()) {
523
+ if (stream._tracks.includes(track)) {
524
+ const trackIdx = stream._tracks.indexOf(track);
525
+ log.debug(`${this._pcId} removetrack ${track.id}`);
526
+ stream._tracks.splice(trackIdx, 1);
527
+ stream.dispatchEvent(new _MediaStreamTrackEvent.default('removetrack', {
528
+ track
529
+ }));
530
+
531
+ // Dispatch a mute event for the track.
532
+ track._setMutedInternal(true);
533
+ }
534
+ }
535
+ }
536
+ });
537
+ (0, _EventEmitter.addListener)(this, 'peerConnectionGotICECandidate', ev => {
538
+ if (ev.pcId !== this._pcId) {
539
+ return;
540
+ }
541
+ const sdpInfo = ev.sdp;
542
+
543
+ // Can happen when doing a rollback.
544
+ if (sdpInfo.type && sdpInfo.sdp) {
545
+ this.localDescription = new _RTCSessionDescription.default(sdpInfo);
546
+ } else {
547
+ this.localDescription = null;
548
+ }
549
+ const candidate = new _RTCIceCandidate.default(ev.candidate);
550
+ this.dispatchEvent(new _RTCIceCandidateEvent.default('icecandidate', {
551
+ candidate
552
+ }));
553
+ });
554
+ (0, _EventEmitter.addListener)(this, 'peerConnectionIceGatheringChanged', ev => {
555
+ if (ev.pcId !== this._pcId) {
556
+ return;
557
+ }
558
+ this.iceGatheringState = ev.iceGatheringState;
559
+ if (this.iceGatheringState === 'complete') {
560
+ const sdpInfo = ev.sdp;
561
+
562
+ // Can happen when doing a rollback.
563
+ if (sdpInfo.type && sdpInfo.sdp) {
564
+ this.localDescription = new _RTCSessionDescription.default(sdpInfo);
565
+ } else {
566
+ this.localDescription = null;
567
+ }
568
+ this.dispatchEvent(new _RTCIceCandidateEvent.default('icecandidate', {
569
+ candidate: null
570
+ }));
571
+ }
572
+ this.dispatchEvent(new _index.Event('icegatheringstatechange'));
573
+ });
574
+ (0, _EventEmitter.addListener)(this, 'peerConnectionDidOpenDataChannel', ev => {
575
+ if (ev.pcId !== this._pcId) {
576
+ return;
577
+ }
578
+ const channel = new _RTCDataChannel.default(ev.dataChannel);
579
+ this.dispatchEvent(new _RTCDataChannelEvent.default('datachannel', {
580
+ channel
581
+ }));
582
+
583
+ // Send 'open' event. Native doesn't update the state since it's already
584
+ // set at this point.
585
+ channel.dispatchEvent(new _RTCDataChannelEvent.default('open', {
586
+ channel
587
+ }));
588
+ });
589
+ (0, _EventEmitter.addListener)(this, 'mediaStreamTrackMuteChanged', ev => {
590
+ if (ev.pcId !== this._pcId) {
591
+ return;
592
+ }
593
+ const [track] = this.getReceivers().map(r => r.track).filter(t => (t === null || t === void 0 ? void 0 : t.id) === ev.trackId);
594
+ if (track) {
595
+ track._setMutedInternal(ev.muted);
596
+ }
597
+ });
598
+ }
599
+
600
+ /**
601
+ * Creates a new RTCDataChannel object with the given label. The
602
+ * RTCDataChannelInit dictionary can be used to configure properties of the
603
+ * underlying channel such as data reliability.
604
+ *
605
+ * @param {string} label - the value with which the label attribute of the new
606
+ * instance is to be initialized
607
+ * @param {RTCDataChannelInit} dataChannelDict - an optional dictionary of
608
+ * values with which to initialize corresponding attributes of the new
609
+ * instance such as id
610
+ */
611
+ createDataChannel(label, dataChannelDict) {
612
+ if (arguments.length === 0) {
613
+ throw new TypeError('1 argument required, but 0 present');
614
+ }
615
+ if (dataChannelDict && 'id' in dataChannelDict) {
616
+ const id = dataChannelDict.id;
617
+ if (typeof id !== 'number') {
618
+ throw new TypeError('DataChannel id must be a number: ' + id);
619
+ }
620
+ }
621
+ const channelInfo = WebRTCModule.createDataChannel(this._pcId, String(label), dataChannelDict);
622
+ if (channelInfo === null) {
623
+ throw new TypeError('Failed to create new DataChannel');
624
+ }
625
+ return new _RTCDataChannel.default(channelInfo);
626
+ }
627
+
628
+ /**
629
+ * Check whether a media stream track exists already in a sender.
630
+ * See https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-addtrack for more information
631
+ */
632
+ _trackExists(track) {
633
+ const [sender] = this.getSenders().filter(sender => {
634
+ var _sender$track;
635
+ return ((_sender$track = sender.track) === null || _sender$track === void 0 ? void 0 : _sender$track.id) === track.id;
636
+ });
637
+ return sender ? true : false;
638
+ }
639
+
640
+ /**
641
+ * Updates transceivers after offer/answer updates if necessary.
642
+ */
643
+ _updateTransceivers(transceiverUpdates) {
644
+ let removeStopped = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
645
+ for (const update of transceiverUpdates) {
646
+ const [transceiver] = this.getTransceivers().filter(t => t.sender.id === update.transceiverId);
647
+ if (!transceiver) {
648
+ continue;
649
+ }
650
+ if (update.currentDirection) {
651
+ transceiver._currentDirection = update.currentDirection;
652
+ }
653
+ transceiver._mid = update.mid;
654
+ transceiver._stopped = Boolean(update.isStopped);
655
+ transceiver._sender._rtpParameters = new _RTCRtpSendParameters.default(update.senderRtpParameters);
656
+ transceiver._receiver._rtpParameters = new _RTCRtpReceiveParameters.default(update.receiverRtpParameters);
657
+ }
658
+ if (removeStopped) {
659
+ const stopped = this.getTransceivers().filter(t => t.stopped);
660
+ const newTransceivers = this._transceivers.filter(t => !stopped.includes(t.transceiver));
661
+ this._transceivers = newTransceivers;
662
+ }
663
+ }
664
+
665
+ /**
666
+ * Inserts transceiver into the transceiver array in the order they are created (timestamp).
667
+ * @param order an index that refers to when it it was created relatively.
668
+ * @param transceiver the transceiver object to be inserted.
669
+ */
670
+ _insertTransceiverSorted(order, transceiver) {
671
+ this._transceivers.push({
672
+ order,
673
+ transceiver
674
+ });
675
+ this._transceivers.sort((a, b) => a.order - b.order);
676
+ }
677
+ }
678
+
679
+ /**
680
+ * Define the `onxxx` event handlers.
681
+ */
682
+ exports.default = RTCPeerConnection;
683
+ const proto = RTCPeerConnection.prototype;
684
+ (0, _index.defineEventAttribute)(proto, 'connectionstatechange');
685
+ (0, _index.defineEventAttribute)(proto, 'icecandidate');
686
+ (0, _index.defineEventAttribute)(proto, 'icecandidateerror');
687
+ (0, _index.defineEventAttribute)(proto, 'iceconnectionstatechange');
688
+ (0, _index.defineEventAttribute)(proto, 'icegatheringstatechange');
689
+ (0, _index.defineEventAttribute)(proto, 'negotiationneeded');
690
+ (0, _index.defineEventAttribute)(proto, 'signalingstatechange');
691
+ (0, _index.defineEventAttribute)(proto, 'datachannel');
692
+ (0, _index.defineEventAttribute)(proto, 'track');
693
+ (0, _index.defineEventAttribute)(proto, 'error');
694
+ //# sourceMappingURL=RTCPeerConnection.js.map