@sbhjt-gr/react-native-webrtc 124.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.
- package/.clang-format +11 -0
- package/.claude/settings.local.json +9 -0
- package/.eslintignore +6 -0
- package/.nvmrc +1 -0
- package/ISSUE_TEMPLATE.md +40 -0
- package/LICENSE +22 -0
- package/README.md +103 -0
- package/android/build.gradle +37 -0
- package/android/consumer-rules.pro +3 -0
- package/android/src/main/AndroidManifest.xml +11 -0
- package/android/src/main/java/com/oney/WebRTCModule/AbstractVideoCaptureController.java +113 -0
- package/android/src/main/java/com/oney/WebRTCModule/CameraCaptureController.java +338 -0
- package/android/src/main/java/com/oney/WebRTCModule/CameraEventsHandler.java +49 -0
- package/android/src/main/java/com/oney/WebRTCModule/DataChannelWrapper.java +99 -0
- package/android/src/main/java/com/oney/WebRTCModule/DataPacketCryptorManager.java +63 -0
- package/android/src/main/java/com/oney/WebRTCModule/DisplayUtils.java +16 -0
- package/android/src/main/java/com/oney/WebRTCModule/EglUtils.java +66 -0
- package/android/src/main/java/com/oney/WebRTCModule/GetUserMediaImpl.java +539 -0
- package/android/src/main/java/com/oney/WebRTCModule/LibraryLoader.java +21 -0
- package/android/src/main/java/com/oney/WebRTCModule/MediaProjectionNotification.java +70 -0
- package/android/src/main/java/com/oney/WebRTCModule/MediaProjectionService.java +82 -0
- package/android/src/main/java/com/oney/WebRTCModule/PeerConnectionObserver.java +588 -0
- package/android/src/main/java/com/oney/WebRTCModule/RTCCryptoManager.java +493 -0
- package/android/src/main/java/com/oney/WebRTCModule/RTCVideoViewManager.java +98 -0
- package/android/src/main/java/com/oney/WebRTCModule/ReactBridgeUtil.java +36 -0
- package/android/src/main/java/com/oney/WebRTCModule/ScreenCaptureController.java +94 -0
- package/android/src/main/java/com/oney/WebRTCModule/SerializeUtils.java +342 -0
- package/android/src/main/java/com/oney/WebRTCModule/StringUtils.java +101 -0
- package/android/src/main/java/com/oney/WebRTCModule/ThreadUtils.java +41 -0
- package/android/src/main/java/com/oney/WebRTCModule/TrackCapturerEventsEmitter.java +34 -0
- package/android/src/main/java/com/oney/WebRTCModule/VideoTrackAdapter.java +137 -0
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java +1643 -0
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCModuleOptions.java +33 -0
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCModulePackage.java +21 -0
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCView.java +583 -0
- package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraClient.java +464 -0
- package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraConfig.java +17 -0
- package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraListener.java +7 -0
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/ProcessorProvider.java +38 -0
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoEffectProcessor.java +59 -0
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoFrameProcessor.java +19 -0
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoFrameProcessorFactoryInterface.java +12 -0
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/H264AndSoftwareVideoDecoderFactory.java +73 -0
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/H264AndSoftwareVideoEncoderFactory.java +73 -0
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/SoftwareVideoDecoderFactoryProxy.java +36 -0
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/SoftwareVideoEncoderFactoryProxy.java +36 -0
- package/android/src/main/java/org/webrtc/Camera1Helper.java +54 -0
- package/android/src/main/java/org/webrtc/Camera2Helper.java +52 -0
- package/android/src/main/res/values/strings.xml +5 -0
- package/android/src/main/res/values/styles.xml +8 -0
- package/apple/.placeholder +0 -0
- package/ios/RCTWebRTC/CaptureController.h +18 -0
- package/ios/RCTWebRTC/CaptureController.m +29 -0
- package/ios/RCTWebRTC/CapturerEventsDelegate.h +12 -0
- package/ios/RCTWebRTC/DataChannelWrapper.h +27 -0
- package/ios/RCTWebRTC/DataChannelWrapper.m +42 -0
- package/ios/RCTWebRTC/I420Converter.h +22 -0
- package/ios/RCTWebRTC/I420Converter.m +164 -0
- package/ios/RCTWebRTC/PIPController.h +24 -0
- package/ios/RCTWebRTC/PIPController.m +234 -0
- package/ios/RCTWebRTC/PalabraAudioSink.h +13 -0
- package/ios/RCTWebRTC/PalabraAudioSink.m +18 -0
- package/ios/RCTWebRTC/PalabraClient.h +36 -0
- package/ios/RCTWebRTC/PalabraClient.m +584 -0
- package/ios/RCTWebRTC/RCTConvert+WebRTC.h +16 -0
- package/ios/RCTWebRTC/RCTConvert+WebRTC.m +206 -0
- package/ios/RCTWebRTC/RTCMediaStreamTrack+React.h +10 -0
- package/ios/RCTWebRTC/RTCMediaStreamTrack+React.m +16 -0
- package/ios/RCTWebRTC/RTCVideoViewManager.h +29 -0
- package/ios/RCTWebRTC/RTCVideoViewManager.m +411 -0
- package/ios/RCTWebRTC/SampleBufferVideoCallView.h +12 -0
- package/ios/RCTWebRTC/SampleBufferVideoCallView.m +178 -0
- package/ios/RCTWebRTC/ScreenCaptureController.h +20 -0
- package/ios/RCTWebRTC/ScreenCaptureController.m +83 -0
- package/ios/RCTWebRTC/ScreenCapturePickerViewManager.h +7 -0
- package/ios/RCTWebRTC/ScreenCapturePickerViewManager.m +60 -0
- package/ios/RCTWebRTC/ScreenCapturer.h +19 -0
- package/ios/RCTWebRTC/ScreenCapturer.m +264 -0
- package/ios/RCTWebRTC/SerializeUtils.h +28 -0
- package/ios/RCTWebRTC/SerializeUtils.m +314 -0
- package/ios/RCTWebRTC/SocketConnection.h +13 -0
- package/ios/RCTWebRTC/SocketConnection.m +137 -0
- package/ios/RCTWebRTC/TrackCapturerEventsEmitter.h +14 -0
- package/ios/RCTWebRTC/TrackCapturerEventsEmitter.m +37 -0
- package/ios/RCTWebRTC/VideoCaptureController.h +21 -0
- package/ios/RCTWebRTC/VideoCaptureController.m +328 -0
- package/ios/RCTWebRTC/WebRTCModule+Palabra.h +4 -0
- package/ios/RCTWebRTC/WebRTCModule+Palabra.m +83 -0
- package/ios/RCTWebRTC/WebRTCModule+Permissions.m +75 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCAudioSession.m +20 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCDataChannel.h +14 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCDataChannel.m +165 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCFrameCryptor.m +611 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.h +14 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m +533 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.h +24 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.m +1004 -0
- package/ios/RCTWebRTC/WebRTCModule+Transceivers.m +267 -0
- package/ios/RCTWebRTC/WebRTCModule+VideoTrackAdapter.h +12 -0
- package/ios/RCTWebRTC/WebRTCModule+VideoTrackAdapter.m +166 -0
- package/ios/RCTWebRTC/WebRTCModule.h +51 -0
- package/ios/RCTWebRTC/WebRTCModule.m +151 -0
- package/ios/RCTWebRTC/WebRTCModuleOptions.h +24 -0
- package/ios/RCTWebRTC/WebRTCModuleOptions.m +31 -0
- package/ios/RCTWebRTC/videoEffects/ProcessorProvider.h +9 -0
- package/ios/RCTWebRTC/videoEffects/ProcessorProvider.m +23 -0
- package/ios/RCTWebRTC/videoEffects/VideoEffectProcessor.h +13 -0
- package/ios/RCTWebRTC/videoEffects/VideoEffectProcessor.m +23 -0
- package/ios/RCTWebRTC/videoEffects/VideoFrameProcessor.h +8 -0
- package/ios/RCTWebRTC.xcodeproj/project.pbxproj +404 -0
- package/ios/RCTWebRTC.xcworkspace/contents.xcworkspacedata +10 -0
- package/lib/commonjs/Constraints.js +2 -0
- package/lib/commonjs/Constraints.js.map +1 -0
- package/lib/commonjs/EventEmitter.js +51 -0
- package/lib/commonjs/EventEmitter.js.map +1 -0
- package/lib/commonjs/Logger.js +47 -0
- package/lib/commonjs/Logger.js.map +1 -0
- package/lib/commonjs/MediaDevices.js +54 -0
- package/lib/commonjs/MediaDevices.js.map +1 -0
- package/lib/commonjs/MediaStream.js +137 -0
- package/lib/commonjs/MediaStream.js.map +1 -0
- package/lib/commonjs/MediaStreamError.js +19 -0
- package/lib/commonjs/MediaStreamError.js.map +1 -0
- package/lib/commonjs/MediaStreamErrorEvent.js +17 -0
- package/lib/commonjs/MediaStreamErrorEvent.js.map +1 -0
- package/lib/commonjs/MediaStreamTrack.js +203 -0
- package/lib/commonjs/MediaStreamTrack.js.map +1 -0
- package/lib/commonjs/MediaStreamTrackEvent.js +26 -0
- package/lib/commonjs/MediaStreamTrackEvent.js.map +1 -0
- package/lib/commonjs/MessageEvent.js +27 -0
- package/lib/commonjs/MessageEvent.js.map +1 -0
- package/lib/commonjs/Permissions.js +116 -0
- package/lib/commonjs/Permissions.js.map +1 -0
- package/lib/commonjs/RTCAudioSession.js +33 -0
- package/lib/commonjs/RTCAudioSession.js.map +1 -0
- package/lib/commonjs/RTCDataChannel.js +165 -0
- package/lib/commonjs/RTCDataChannel.js.map +1 -0
- package/lib/commonjs/RTCDataChannelEvent.js +26 -0
- package/lib/commonjs/RTCDataChannelEvent.js.map +1 -0
- package/lib/commonjs/RTCDataPacketCryptor.js +76 -0
- package/lib/commonjs/RTCDataPacketCryptor.js.map +1 -0
- package/lib/commonjs/RTCDataPacketCryptorFactory.js +27 -0
- package/lib/commonjs/RTCDataPacketCryptorFactory.js.map +1 -0
- package/lib/commonjs/RTCErrorEvent.js +23 -0
- package/lib/commonjs/RTCErrorEvent.js.map +1 -0
- package/lib/commonjs/RTCFrameCryptor.js +138 -0
- package/lib/commonjs/RTCFrameCryptor.js.map +1 -0
- package/lib/commonjs/RTCFrameCryptorFactory.js +81 -0
- package/lib/commonjs/RTCFrameCryptorFactory.js.map +1 -0
- package/lib/commonjs/RTCIceCandidate.js +34 -0
- package/lib/commonjs/RTCIceCandidate.js.map +1 -0
- package/lib/commonjs/RTCIceCandidateEvent.js +28 -0
- package/lib/commonjs/RTCIceCandidateEvent.js.map +1 -0
- package/lib/commonjs/RTCKeyProvider.js +111 -0
- package/lib/commonjs/RTCKeyProvider.js.map +1 -0
- package/lib/commonjs/RTCPIPView.js +38 -0
- package/lib/commonjs/RTCPIPView.js.map +1 -0
- package/lib/commonjs/RTCPIPView.web.js +23 -0
- package/lib/commonjs/RTCPIPView.web.js.map +1 -0
- package/lib/commonjs/RTCPeerConnection.js +694 -0
- package/lib/commonjs/RTCPeerConnection.js.map +1 -0
- package/lib/commonjs/RTCRtcpParameters.js +24 -0
- package/lib/commonjs/RTCRtcpParameters.js.map +1 -0
- package/lib/commonjs/RTCRtpCapabilities.js +22 -0
- package/lib/commonjs/RTCRtpCapabilities.js.map +1 -0
- package/lib/commonjs/RTCRtpCodecCapability.js +19 -0
- package/lib/commonjs/RTCRtpCodecCapability.js.map +1 -0
- package/lib/commonjs/RTCRtpCodecParameters.js +38 -0
- package/lib/commonjs/RTCRtpCodecParameters.js.map +1 -0
- package/lib/commonjs/RTCRtpEncodingParameters.js +78 -0
- package/lib/commonjs/RTCRtpEncodingParameters.js.map +1 -0
- package/lib/commonjs/RTCRtpHeaderExtension.js +27 -0
- package/lib/commonjs/RTCRtpHeaderExtension.js.map +1 -0
- package/lib/commonjs/RTCRtpParameters.js +35 -0
- package/lib/commonjs/RTCRtpParameters.js.map +1 -0
- package/lib/commonjs/RTCRtpReceiveParameters.js +15 -0
- package/lib/commonjs/RTCRtpReceiveParameters.js.map +1 -0
- package/lib/commonjs/RTCRtpReceiver.js +53 -0
- package/lib/commonjs/RTCRtpReceiver.js.map +1 -0
- package/lib/commonjs/RTCRtpSendParameters.js +49 -0
- package/lib/commonjs/RTCRtpSendParameters.js.map +1 -0
- package/lib/commonjs/RTCRtpSender.js +67 -0
- package/lib/commonjs/RTCRtpSender.js.map +1 -0
- package/lib/commonjs/RTCRtpTransceiver.js +81 -0
- package/lib/commonjs/RTCRtpTransceiver.js.map +1 -0
- package/lib/commonjs/RTCSessionDescription.js +33 -0
- package/lib/commonjs/RTCSessionDescription.js.map +1 -0
- package/lib/commonjs/RTCTrackEvent.js +38 -0
- package/lib/commonjs/RTCTrackEvent.js.map +1 -0
- package/lib/commonjs/RTCUtil.js +186 -0
- package/lib/commonjs/RTCUtil.js.map +1 -0
- package/lib/commonjs/RTCView.js +16 -0
- package/lib/commonjs/RTCView.js.map +1 -0
- package/lib/commonjs/RTCView.web.js +62 -0
- package/lib/commonjs/RTCView.web.js.map +1 -0
- package/lib/commonjs/ScreenCapturePickerView.js +10 -0
- package/lib/commonjs/ScreenCapturePickerView.js.map +1 -0
- package/lib/commonjs/ScreenCapturePickerView.web.js +10 -0
- package/lib/commonjs/ScreenCapturePickerView.web.js.map +1 -0
- package/lib/commonjs/getDisplayMedia.js +33 -0
- package/lib/commonjs/getDisplayMedia.js.map +1 -0
- package/lib/commonjs/getUserMedia.js +101 -0
- package/lib/commonjs/getUserMedia.js.map +1 -0
- package/lib/commonjs/index.js +224 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/index.web.js +175 -0
- package/lib/commonjs/index.web.js.map +1 -0
- package/lib/commonjs/webStream.js +35 -0
- package/lib/commonjs/webStream.js.map +1 -0
- package/lib/module/Constraints.js +2 -0
- package/lib/module/Constraints.js.map +1 -0
- package/lib/module/EventEmitter.js +41 -0
- package/lib/module/EventEmitter.js.map +1 -0
- package/lib/module/Logger.js +39 -0
- package/lib/module/Logger.js.map +1 -0
- package/lib/module/MediaDevices.js +46 -0
- package/lib/module/MediaDevices.js.map +1 -0
- package/lib/module/MediaStream.js +129 -0
- package/lib/module/MediaStream.js.map +1 -0
- package/lib/module/MediaStreamError.js +12 -0
- package/lib/module/MediaStreamError.js.map +1 -0
- package/lib/module/MediaStreamErrorEvent.js +10 -0
- package/lib/module/MediaStreamErrorEvent.js.map +1 -0
- package/lib/module/MediaStreamTrack.js +195 -0
- package/lib/module/MediaStreamTrack.js.map +1 -0
- package/lib/module/MediaStreamTrackEvent.js +19 -0
- package/lib/module/MediaStreamTrackEvent.js.map +1 -0
- package/lib/module/MessageEvent.js +20 -0
- package/lib/module/MessageEvent.js.map +1 -0
- package/lib/module/Permissions.js +109 -0
- package/lib/module/Permissions.js.map +1 -0
- package/lib/module/RTCAudioSession.js +26 -0
- package/lib/module/RTCAudioSession.js.map +1 -0
- package/lib/module/RTCDataChannel.js +155 -0
- package/lib/module/RTCDataChannel.js.map +1 -0
- package/lib/module/RTCDataChannelEvent.js +19 -0
- package/lib/module/RTCDataChannelEvent.js.map +1 -0
- package/lib/module/RTCDataPacketCryptor.js +66 -0
- package/lib/module/RTCDataPacketCryptor.js.map +1 -0
- package/lib/module/RTCDataPacketCryptorFactory.js +19 -0
- package/lib/module/RTCDataPacketCryptorFactory.js.map +1 -0
- package/lib/module/RTCErrorEvent.js +16 -0
- package/lib/module/RTCErrorEvent.js.map +1 -0
- package/lib/module/RTCFrameCryptor.js +128 -0
- package/lib/module/RTCFrameCryptor.js.map +1 -0
- package/lib/module/RTCFrameCryptorFactory.js +70 -0
- package/lib/module/RTCFrameCryptorFactory.js.map +1 -0
- package/lib/module/RTCIceCandidate.js +27 -0
- package/lib/module/RTCIceCandidate.js.map +1 -0
- package/lib/module/RTCIceCandidateEvent.js +21 -0
- package/lib/module/RTCIceCandidateEvent.js.map +1 -0
- package/lib/module/RTCKeyProvider.js +101 -0
- package/lib/module/RTCKeyProvider.js.map +1 -0
- package/lib/module/RTCPIPView.js +26 -0
- package/lib/module/RTCPIPView.js.map +1 -0
- package/lib/module/RTCPIPView.web.js +11 -0
- package/lib/module/RTCPIPView.web.js.map +1 -0
- package/lib/module/RTCPeerConnection.js +684 -0
- package/lib/module/RTCPeerConnection.js.map +1 -0
- package/lib/module/RTCRtcpParameters.js +17 -0
- package/lib/module/RTCRtcpParameters.js.map +1 -0
- package/lib/module/RTCRtpCapabilities.js +15 -0
- package/lib/module/RTCRtpCapabilities.js.map +1 -0
- package/lib/module/RTCRtpCodecCapability.js +12 -0
- package/lib/module/RTCRtpCodecCapability.js.map +1 -0
- package/lib/module/RTCRtpCodecParameters.js +31 -0
- package/lib/module/RTCRtpCodecParameters.js.map +1 -0
- package/lib/module/RTCRtpEncodingParameters.js +71 -0
- package/lib/module/RTCRtpEncodingParameters.js.map +1 -0
- package/lib/module/RTCRtpHeaderExtension.js +20 -0
- package/lib/module/RTCRtpHeaderExtension.js.map +1 -0
- package/lib/module/RTCRtpParameters.js +27 -0
- package/lib/module/RTCRtpParameters.js.map +1 -0
- package/lib/module/RTCRtpReceiveParameters.js +7 -0
- package/lib/module/RTCRtpReceiveParameters.js.map +1 -0
- package/lib/module/RTCRtpReceiver.js +45 -0
- package/lib/module/RTCRtpReceiver.js.map +1 -0
- package/lib/module/RTCRtpSendParameters.js +41 -0
- package/lib/module/RTCRtpSendParameters.js.map +1 -0
- package/lib/module/RTCRtpSender.js +59 -0
- package/lib/module/RTCRtpSender.js.map +1 -0
- package/lib/module/RTCRtpTransceiver.js +74 -0
- package/lib/module/RTCRtpTransceiver.js.map +1 -0
- package/lib/module/RTCSessionDescription.js +26 -0
- package/lib/module/RTCSessionDescription.js.map +1 -0
- package/lib/module/RTCTrackEvent.js +31 -0
- package/lib/module/RTCTrackEvent.js.map +1 -0
- package/lib/module/RTCUtil.js +176 -0
- package/lib/module/RTCUtil.js.map +1 -0
- package/lib/module/RTCView.js +11 -0
- package/lib/module/RTCView.js.map +1 -0
- package/lib/module/RTCView.web.js +54 -0
- package/lib/module/RTCView.web.js.map +1 -0
- package/lib/module/ScreenCapturePickerView.js +3 -0
- package/lib/module/ScreenCapturePickerView.js.map +1 -0
- package/lib/module/ScreenCapturePickerView.web.js +4 -0
- package/lib/module/ScreenCapturePickerView.web.js.map +1 -0
- package/lib/module/getDisplayMedia.js +26 -0
- package/lib/module/getDisplayMedia.js.map +1 -0
- package/lib/module/getUserMedia.js +92 -0
- package/lib/module/getUserMedia.js.map +1 -0
- package/lib/module/index.js +60 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/index.web.js +114 -0
- package/lib/module/index.web.js.map +1 -0
- package/lib/module/webStream.js +27 -0
- package/lib/module/webStream.js.map +1 -0
- package/lib/typescript/Constraints.d.ts +19 -0
- package/lib/typescript/EventEmitter.d.ts +6 -0
- package/lib/typescript/Logger.d.ts +13 -0
- package/lib/typescript/MediaDevices.d.ts +30 -0
- package/lib/typescript/MediaStream.d.ts +48 -0
- package/lib/typescript/MediaStreamError.d.ts +6 -0
- package/lib/typescript/MediaStreamErrorEvent.d.ts +6 -0
- package/lib/typescript/MediaStreamTrack.d.ts +101 -0
- package/lib/typescript/MediaStreamTrackEvent.d.ts +19 -0
- package/lib/typescript/MessageEvent.d.ts +20 -0
- package/lib/typescript/Permissions.d.ts +55 -0
- package/lib/typescript/RTCAudioSession.d.ts +10 -0
- package/lib/typescript/RTCDataChannel.d.ts +43 -0
- package/lib/typescript/RTCDataChannelEvent.d.ts +19 -0
- package/lib/typescript/RTCDataPacketCryptor.d.ts +12 -0
- package/lib/typescript/RTCDataPacketCryptorFactory.d.ts +6 -0
- package/lib/typescript/RTCErrorEvent.d.ts +12 -0
- package/lib/typescript/RTCFrameCryptor.d.ts +47 -0
- package/lib/typescript/RTCFrameCryptorFactory.d.ts +21 -0
- package/lib/typescript/RTCIceCandidate.d.ts +17 -0
- package/lib/typescript/RTCIceCandidateEvent.d.ts +20 -0
- package/lib/typescript/RTCKeyProvider.d.ts +21 -0
- package/lib/typescript/RTCPIPView.d.ts +15 -0
- package/lib/typescript/RTCPIPView.web.d.ts +13 -0
- package/lib/typescript/RTCPeerConnection.d.ts +117 -0
- package/lib/typescript/RTCRtcpParameters.d.ts +10 -0
- package/lib/typescript/RTCRtpCapabilities.d.ts +9 -0
- package/lib/typescript/RTCRtpCodecCapability.d.ts +7 -0
- package/lib/typescript/RTCRtpCodecParameters.d.ts +16 -0
- package/lib/typescript/RTCRtpEncodingParameters.d.ts +23 -0
- package/lib/typescript/RTCRtpHeaderExtension.d.ts +12 -0
- package/lib/typescript/RTCRtpParameters.d.ts +19 -0
- package/lib/typescript/RTCRtpReceiveParameters.d.ts +4 -0
- package/lib/typescript/RTCRtpReceiver.d.ts +21 -0
- package/lib/typescript/RTCRtpSendParameters.d.ts +20 -0
- package/lib/typescript/RTCRtpSender.d.ts +22 -0
- package/lib/typescript/RTCRtpTransceiver.d.ts +31 -0
- package/lib/typescript/RTCSessionDescription.d.ts +12 -0
- package/lib/typescript/RTCTrackEvent.d.ts +29 -0
- package/lib/typescript/RTCUtil.d.ts +37 -0
- package/lib/typescript/RTCView.d.ts +117 -0
- package/lib/typescript/RTCView.web.d.ts +25 -0
- package/lib/typescript/ScreenCapturePickerView.d.ts +2 -0
- package/lib/typescript/ScreenCapturePickerView.web.d.ts +1 -0
- package/lib/typescript/getDisplayMedia.d.ts +2 -0
- package/lib/typescript/getUserMedia.d.ts +7 -0
- package/lib/typescript/index.d.ts +22 -0
- package/lib/typescript/index.web.d.ts +101 -0
- package/lib/typescript/webStream.d.ts +3 -0
- package/livekit-react-native-webrtc.podspec +29 -0
- package/macos/RCTWebRTC.xcodeproj/project.pbxproj +324 -0
- package/macos/RCTWebRTC.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/macos/RCTWebRTC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/metro.config.js +7 -0
- package/metro.config.macos.js +14 -0
- package/package.json +66 -0
- package/react-native.config.js +11 -0
- package/src/.eslintrc.cjs +67 -0
- package/src/Constraints.ts +21 -0
- package/src/EventEmitter.ts +65 -0
- package/src/Logger.ts +49 -0
- package/src/MediaDevices.ts +53 -0
- package/src/MediaStream.ts +161 -0
- package/src/MediaStreamError.ts +12 -0
- package/src/MediaStreamErrorEvent.ts +11 -0
- package/src/MediaStreamTrack.ts +284 -0
- package/src/MediaStreamTrackEvent.ts +25 -0
- package/src/MessageEvent.ts +26 -0
- package/src/Permissions.ts +133 -0
- package/src/RTCAudioSession.ts +25 -0
- package/src/RTCDataChannel.ts +190 -0
- package/src/RTCDataChannelEvent.ts +28 -0
- package/src/RTCDataPacketCryptor.ts +90 -0
- package/src/RTCDataPacketCryptorFactory.ts +25 -0
- package/src/RTCErrorEvent.ts +21 -0
- package/src/RTCFrameCryptor.ts +163 -0
- package/src/RTCFrameCryptorFactory.ts +102 -0
- package/src/RTCIceCandidate.ts +29 -0
- package/src/RTCIceCandidateEvent.ts +26 -0
- package/src/RTCKeyProvider.ts +117 -0
- package/src/RTCPIPView.tsx +47 -0
- package/src/RTCPIPView.web.tsx +18 -0
- package/src/RTCPeerConnection.ts +832 -0
- package/src/RTCRtcpParameters.ts +23 -0
- package/src/RTCRtpCapabilities.ts +16 -0
- package/src/RTCRtpCodecCapability.ts +13 -0
- package/src/RTCRtpCodecParameters.ts +44 -0
- package/src/RTCRtpEncodingParameters.ts +90 -0
- package/src/RTCRtpHeaderExtension.ts +27 -0
- package/src/RTCRtpParameters.ts +37 -0
- package/src/RTCRtpReceiveParameters.ts +7 -0
- package/src/RTCRtpReceiver.ts +60 -0
- package/src/RTCRtpSendParameters.ts +63 -0
- package/src/RTCRtpSender.ts +78 -0
- package/src/RTCRtpTransceiver.ts +107 -0
- package/src/RTCSessionDescription.ts +30 -0
- package/src/RTCTrackEvent.ts +42 -0
- package/src/RTCUtil.ts +211 -0
- package/src/RTCView.ts +122 -0
- package/src/RTCView.web.tsx +82 -0
- package/src/ScreenCapturePickerView.ts +4 -0
- package/src/ScreenCapturePickerView.web.tsx +3 -0
- package/src/getDisplayMedia.ts +30 -0
- package/src/getUserMedia.ts +111 -0
- package/src/index.ts +107 -0
- package/src/index.web.ts +191 -0
- package/src/webStream.ts +33 -0
- package/tools/format.sh +6 -0
- package/tools/release.sh +45 -0
- package/tsconfig.json +17 -0
package/src/RTCUtil.ts
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
|
|
2
|
+
const DEFAULT_AUDIO_CONSTRAINTS = {};
|
|
3
|
+
|
|
4
|
+
const DEFAULT_VIDEO_CONSTRAINTS = {
|
|
5
|
+
facingMode: 'user',
|
|
6
|
+
frameRate: 30,
|
|
7
|
+
height: 720,
|
|
8
|
+
width: 1280
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const FACING_MODES = [ 'user', 'environment' ];
|
|
12
|
+
|
|
13
|
+
const ASPECT_RATIO = 16 / 9;
|
|
14
|
+
|
|
15
|
+
export type RTCOfferOptions = {
|
|
16
|
+
iceRestart?:boolean;
|
|
17
|
+
offerToReceiveAudio?: boolean;
|
|
18
|
+
offerToReceiveVideo?: boolean;
|
|
19
|
+
voiceActivityDetection?:boolean
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const STANDARD_OFFER_OPTIONS = {
|
|
23
|
+
icerestart: 'IceRestart',
|
|
24
|
+
offertoreceiveaudio: 'OfferToReceiveAudio',
|
|
25
|
+
offertoreceivevideo: 'OfferToReceiveVideo',
|
|
26
|
+
voiceactivitydetection: 'VoiceActivityDetection'
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const SDP_TYPES = [
|
|
30
|
+
'offer',
|
|
31
|
+
'pranswer',
|
|
32
|
+
'answer',
|
|
33
|
+
'rollback'
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
function getDefaultMediaConstraints(mediaType) {
|
|
37
|
+
switch (mediaType) {
|
|
38
|
+
case 'audio':
|
|
39
|
+
return DEFAULT_AUDIO_CONSTRAINTS;
|
|
40
|
+
case 'video':
|
|
41
|
+
return DEFAULT_VIDEO_CONSTRAINTS;
|
|
42
|
+
default:
|
|
43
|
+
throw new TypeError(`Invalid media type: ${mediaType}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function extractString(constraints, prop) {
|
|
48
|
+
const value = constraints[prop];
|
|
49
|
+
const type = typeof value;
|
|
50
|
+
|
|
51
|
+
if (type === 'object') {
|
|
52
|
+
for (const v of [ 'exact', 'ideal' ]) {
|
|
53
|
+
if (value[v]) {
|
|
54
|
+
return value[v];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
} else if (type === 'string') {
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function extractNumber(constraints, prop) {
|
|
63
|
+
const value = constraints[prop];
|
|
64
|
+
const type = typeof value;
|
|
65
|
+
|
|
66
|
+
if (type === 'number') {
|
|
67
|
+
return Number.parseInt(value);
|
|
68
|
+
} else if (type === 'object') {
|
|
69
|
+
for (const v of [ 'exact', 'ideal', 'max', 'min' ]) {
|
|
70
|
+
if (value[v]) {
|
|
71
|
+
return Number.parseInt(value[v]);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function normalizeMediaConstraints(constraints, mediaType) {
|
|
78
|
+
switch (mediaType) {
|
|
79
|
+
case 'audio':
|
|
80
|
+
return constraints;
|
|
81
|
+
|
|
82
|
+
case 'video': {
|
|
83
|
+
const c = {
|
|
84
|
+
deviceId: extractString(constraints, 'deviceId'),
|
|
85
|
+
facingMode: extractString(constraints, 'facingMode'),
|
|
86
|
+
frameRate: extractNumber(constraints, 'frameRate'),
|
|
87
|
+
height: extractNumber(constraints, 'height'),
|
|
88
|
+
width: extractNumber(constraints, 'width')
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
if (!c.deviceId) {
|
|
92
|
+
delete c.deviceId;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (!FACING_MODES.includes(c.facingMode)) {
|
|
96
|
+
c.facingMode = DEFAULT_VIDEO_CONSTRAINTS.facingMode;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (!c.frameRate) {
|
|
100
|
+
c.frameRate = DEFAULT_VIDEO_CONSTRAINTS.frameRate;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (!c.height && !c.width) {
|
|
104
|
+
c.height = DEFAULT_VIDEO_CONSTRAINTS.height;
|
|
105
|
+
c.width = DEFAULT_VIDEO_CONSTRAINTS.width;
|
|
106
|
+
} else if (!c.height && c.width) {
|
|
107
|
+
c.height = Math.round(c.width / ASPECT_RATIO);
|
|
108
|
+
} else if (!c.width && c.height) {
|
|
109
|
+
c.width = Math.round(c.height * ASPECT_RATIO);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return c;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
default:
|
|
116
|
+
throw new TypeError(`Invalid media type: ${mediaType}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Utility for creating short random strings from float point values.
|
|
122
|
+
* We take 4 characters from the end after converting to a string.
|
|
123
|
+
* Conversion to string gives us some letters as we don't want just numbers.
|
|
124
|
+
* Should be suitable to pass for enough randomness.
|
|
125
|
+
*
|
|
126
|
+
* @return {String} 4 random characters
|
|
127
|
+
*/
|
|
128
|
+
function chr4() {
|
|
129
|
+
return Math.random().toString(16).slice(-4);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Put together a random string in UUIDv4 format {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
|
|
134
|
+
*
|
|
135
|
+
* @return {String} uuidv4
|
|
136
|
+
*/
|
|
137
|
+
export function uniqueID(): string {
|
|
138
|
+
return `${chr4()}${chr4()}-${chr4()}-${chr4()}-${chr4()}-${chr4()}${chr4()}${chr4()}`;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Utility for deep cloning an object. Object.assign() only does a shallow copy.
|
|
143
|
+
*
|
|
144
|
+
* @param {Object} obj - object to be cloned
|
|
145
|
+
* @return {Object} cloned obj
|
|
146
|
+
*/
|
|
147
|
+
export function deepClone<T>(obj: T): T {
|
|
148
|
+
return JSON.parse(JSON.stringify(obj));
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Checks whether an SDP type is valid or not.
|
|
153
|
+
*
|
|
154
|
+
* @param type SDP type to check.
|
|
155
|
+
* @returns Whether the SDP type is valid or not.
|
|
156
|
+
*/
|
|
157
|
+
export function isSdpTypeValid(type: string): boolean {
|
|
158
|
+
return SDP_TYPES.includes(type);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Normalize options passed to createOffer().
|
|
163
|
+
*
|
|
164
|
+
* @param options - user supplied options
|
|
165
|
+
* @return Normalized options
|
|
166
|
+
*/
|
|
167
|
+
export function normalizeOfferOptions(options?: RTCOfferOptions) {
|
|
168
|
+
const newOptions: Record<string,string> = {};
|
|
169
|
+
|
|
170
|
+
if (typeof options !== 'object') {
|
|
171
|
+
return newOptions;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Convert standard options into WebRTC internal constant names.
|
|
175
|
+
// See: https://github.com/jitsi/webrtc/blob/0cd6ce4de669bed94ba47b88cb71b9be0341bb81/sdk/media_constraints.cc#L113
|
|
176
|
+
for (const [ key, value ] of Object.entries(options)) {
|
|
177
|
+
const newKey = STANDARD_OFFER_OPTIONS[key.toLowerCase()];
|
|
178
|
+
|
|
179
|
+
if (newKey) {
|
|
180
|
+
newOptions[newKey] = String(Boolean(value));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return newOptions;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Normalize the given constraints in something we can work with.
|
|
189
|
+
*/
|
|
190
|
+
export function normalizeConstraints(constraints) {
|
|
191
|
+
const c = deepClone(constraints);
|
|
192
|
+
|
|
193
|
+
for (const mediaType of [ 'audio', 'video' ]) {
|
|
194
|
+
const mediaTypeConstraints = c[mediaType];
|
|
195
|
+
const typeofMediaTypeConstraints = typeof mediaTypeConstraints;
|
|
196
|
+
|
|
197
|
+
if (typeofMediaTypeConstraints !== 'undefined') {
|
|
198
|
+
if (typeofMediaTypeConstraints === 'boolean') {
|
|
199
|
+
if (mediaTypeConstraints) {
|
|
200
|
+
c[mediaType] = getDefaultMediaConstraints(mediaType);
|
|
201
|
+
}
|
|
202
|
+
} else if (typeofMediaTypeConstraints === 'object') {
|
|
203
|
+
c[mediaType] = normalizeMediaConstraints(mediaTypeConstraints, mediaType);
|
|
204
|
+
} else {
|
|
205
|
+
throw new TypeError(`constraints.${mediaType} is neither a boolean nor a dictionary`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return c;
|
|
211
|
+
}
|
package/src/RTCView.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { requireNativeComponent, ViewProps } from 'react-native';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Native prop validation was removed from RN in:
|
|
5
|
+
* https://github.com/facebook/react-native/commit/8dc3ba0444c94d9bbb66295b5af885bff9b9cd34
|
|
6
|
+
*
|
|
7
|
+
* So we list them here for documentation purposes.
|
|
8
|
+
*/
|
|
9
|
+
export interface RTCVideoViewProps extends ViewProps {
|
|
10
|
+
/**
|
|
11
|
+
* Indicates whether the video specified by {@link #streamURL} should be
|
|
12
|
+
* mirrored during rendering. Commonly, applications choose to mirror the
|
|
13
|
+
* user-facing camera.
|
|
14
|
+
*
|
|
15
|
+
* mirror: boolean
|
|
16
|
+
*/
|
|
17
|
+
mirror?: boolean;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* In the fashion of
|
|
21
|
+
* https://www.w3.org/TR/html5/embedded-content-0.html#dom-video-videowidth
|
|
22
|
+
* and https://www.w3.org/TR/html5/rendering.html#video-object-fit,
|
|
23
|
+
* resembles the CSS style object-fit.
|
|
24
|
+
*
|
|
25
|
+
* objectFit: 'contain' | 'cover'
|
|
26
|
+
*
|
|
27
|
+
* Defaults to 'cover'.
|
|
28
|
+
*/
|
|
29
|
+
objectFit?: 'contain' | 'cover';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* URL / id of the stream that should be rendered.
|
|
33
|
+
*
|
|
34
|
+
* streamURL: string
|
|
35
|
+
*/
|
|
36
|
+
streamURL?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Similarly to the CSS property z-index, specifies the z-order of this
|
|
39
|
+
* RTCView in the stacking space of all RTCViews. When RTCViews overlap,
|
|
40
|
+
* zOrder determines which one covers the other. An RTCView with a larger
|
|
41
|
+
* zOrder generally covers an RTCView with a lower one.
|
|
42
|
+
*
|
|
43
|
+
* Non-overlapping RTCViews may safely share a z-order (because one does not
|
|
44
|
+
* have to cover the other).
|
|
45
|
+
*
|
|
46
|
+
* The support for zOrder is platform-dependent and/or
|
|
47
|
+
* implementation-specific. Thus, specifying a value for zOrder is to be
|
|
48
|
+
* thought of as giving a hint rather than as imposing a requirement. For
|
|
49
|
+
* example, video renderers such as RTCView are commonly implemented using
|
|
50
|
+
* OpenGL and OpenGL views may have different numbers of layers in their
|
|
51
|
+
* stacking space. Android has three: a layer bellow the window (aka
|
|
52
|
+
* default), a layer bellow the window again but above the previous layer
|
|
53
|
+
* (aka media overlay), and above the window. Consequently, it is advisable
|
|
54
|
+
* to limit the number of utilized layers in the stacking space to the
|
|
55
|
+
* minimum sufficient for the desired display. For example, a video call
|
|
56
|
+
* application usually needs a maximum of two zOrder values: 0 for the
|
|
57
|
+
* remote video(s) which appear in the background, and 1 for the local
|
|
58
|
+
* video(s) which appear above the remote video(s).
|
|
59
|
+
*
|
|
60
|
+
* zOrder: number
|
|
61
|
+
*/
|
|
62
|
+
zOrder?: number;
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Picture in picture options for this view. Disabled if not supplied.
|
|
67
|
+
*
|
|
68
|
+
* Note: this should only be generally only used with remote video tracks,
|
|
69
|
+
* as the local camera may stop while in the background.
|
|
70
|
+
*
|
|
71
|
+
* iOS only. Requires iOS 15.0 or above, and the PIP background mode capability.
|
|
72
|
+
*/
|
|
73
|
+
iosPIP?: RTCIOSPIPOptions;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Callback function that is called when the dimensions of the video change.
|
|
77
|
+
*
|
|
78
|
+
* @param {Object} event - The event object containing the new dimensions.
|
|
79
|
+
* @param {Object} event.nativeEvent - The native event data.
|
|
80
|
+
* @param {number} event.nativeEvent.width - The width of the video.
|
|
81
|
+
* @param {number} event.nativeEvent.height - The height of the video.
|
|
82
|
+
*/
|
|
83
|
+
onDimensionsChange?: (event: { nativeEvent: { width: number; height: number } }) => void;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface RTCIOSPIPOptions {
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Whether PIP can be launched from this view.
|
|
90
|
+
*
|
|
91
|
+
* Defaults to true.
|
|
92
|
+
*/
|
|
93
|
+
enabled?: boolean;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* The preferred size of the PIP window.
|
|
97
|
+
*/
|
|
98
|
+
preferredSize?: {
|
|
99
|
+
width: number;
|
|
100
|
+
height: number;
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Indicates whether Picture in Picture starts automatically
|
|
105
|
+
* when the controller embeds its content inline and the app
|
|
106
|
+
* transitions to the background.
|
|
107
|
+
*
|
|
108
|
+
* Defaults to true.
|
|
109
|
+
*
|
|
110
|
+
* See: AVPictureInPictureController.canStartPictureInPictureAutomaticallyFromInline
|
|
111
|
+
*/
|
|
112
|
+
startAutomatically?: boolean;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Indicates whether Picture in Picture should stop automatically
|
|
116
|
+
* when the app returns to the foreground.
|
|
117
|
+
*
|
|
118
|
+
* Defaults to true.
|
|
119
|
+
*/
|
|
120
|
+
stopAutomatically?: boolean;
|
|
121
|
+
}
|
|
122
|
+
export default requireNativeComponent<RTCVideoViewProps>('RTCVideoView');
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React, { useEffect, useMemo, useRef } from 'react';
|
|
2
|
+
import { StyleSheet, View, ViewProps } from 'react-native';
|
|
3
|
+
|
|
4
|
+
import { getStream } from './webStream';
|
|
5
|
+
|
|
6
|
+
export interface RTCVideoViewProps extends ViewProps {
|
|
7
|
+
mirror?: boolean;
|
|
8
|
+
objectFit?: 'contain' | 'cover';
|
|
9
|
+
streamURL?: string;
|
|
10
|
+
zOrder?: number;
|
|
11
|
+
iosPIP?: RTCIOSPIPOptions;
|
|
12
|
+
onDimensionsChange?: (event: { nativeEvent: { width: number; height: number } }) => void;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface RTCIOSPIPOptions {
|
|
16
|
+
enabled?: boolean;
|
|
17
|
+
preferredSize?: {
|
|
18
|
+
width: number;
|
|
19
|
+
height: number;
|
|
20
|
+
};
|
|
21
|
+
startAutomatically?: boolean;
|
|
22
|
+
stopAutomatically?: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default function RTCView({
|
|
26
|
+
mirror,
|
|
27
|
+
objectFit = 'cover',
|
|
28
|
+
streamURL,
|
|
29
|
+
style,
|
|
30
|
+
onDimensionsChange,
|
|
31
|
+
}: RTCVideoViewProps) {
|
|
32
|
+
const ref = useRef<HTMLVideoElement | null>(null);
|
|
33
|
+
const stream = useMemo(() => getStream(streamURL), [ streamURL ]);
|
|
34
|
+
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (!ref.current) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
ref.current.srcObject = stream;
|
|
41
|
+
}, [ stream ]);
|
|
42
|
+
|
|
43
|
+
const flatStyle = StyleSheet.flatten(style) as React.CSSProperties | undefined;
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<View style={[ styles.container, style ]}>
|
|
47
|
+
{React.createElement('video', {
|
|
48
|
+
autoPlay: true,
|
|
49
|
+
muted: true,
|
|
50
|
+
playsInline: true,
|
|
51
|
+
ref,
|
|
52
|
+
onLoadedMetadata: (event: Event) => {
|
|
53
|
+
const target = event.currentTarget as HTMLVideoElement | null;
|
|
54
|
+
|
|
55
|
+
if (!target || !onDimensionsChange) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
onDimensionsChange({
|
|
60
|
+
nativeEvent: {
|
|
61
|
+
width: target.videoWidth,
|
|
62
|
+
height: target.videoHeight,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
},
|
|
66
|
+
style: {
|
|
67
|
+
...flatStyle,
|
|
68
|
+
width: '100%',
|
|
69
|
+
height: '100%',
|
|
70
|
+
objectFit,
|
|
71
|
+
transform: mirror ? 'scaleX(-1)' : undefined,
|
|
72
|
+
},
|
|
73
|
+
})}
|
|
74
|
+
</View>
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const styles = StyleSheet.create({
|
|
79
|
+
container: {
|
|
80
|
+
overflow: 'hidden',
|
|
81
|
+
},
|
|
82
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
|
|
2
|
+
import { NativeModules } from 'react-native';
|
|
3
|
+
|
|
4
|
+
import MediaStream from './MediaStream';
|
|
5
|
+
import MediaStreamError from './MediaStreamError';
|
|
6
|
+
|
|
7
|
+
const { WebRTCModule } = NativeModules;
|
|
8
|
+
|
|
9
|
+
export default function getDisplayMedia(): Promise<MediaStream> {
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
WebRTCModule.getDisplayMedia().then(
|
|
12
|
+
data => {
|
|
13
|
+
const { streamId, track } = data;
|
|
14
|
+
|
|
15
|
+
const info = {
|
|
16
|
+
streamId: streamId,
|
|
17
|
+
streamReactTag: streamId,
|
|
18
|
+
tracks: [ track ]
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const stream = new MediaStream(info);
|
|
22
|
+
|
|
23
|
+
resolve(stream);
|
|
24
|
+
},
|
|
25
|
+
error => {
|
|
26
|
+
reject(new MediaStreamError(error));
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
|
|
2
|
+
import { NativeModules } from 'react-native';
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
import { MediaTrackConstraints } from './Constraints';
|
|
6
|
+
import MediaStream from './MediaStream';
|
|
7
|
+
import MediaStreamError from './MediaStreamError';
|
|
8
|
+
import permissions from './Permissions';
|
|
9
|
+
import * as RTCUtil from './RTCUtil';
|
|
10
|
+
|
|
11
|
+
const { WebRTCModule } = NativeModules;
|
|
12
|
+
|
|
13
|
+
export interface Constraints {
|
|
14
|
+
audio?: boolean | MediaTrackConstraints;
|
|
15
|
+
video?: boolean | MediaTrackConstraints;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default function getUserMedia(constraints: Constraints = {}): Promise<MediaStream> {
|
|
19
|
+
// According to
|
|
20
|
+
// https://www.w3.org/TR/mediacapture-streams/#dom-mediadevices-getusermedia,
|
|
21
|
+
// the constraints argument is a dictionary of type MediaStreamConstraints.
|
|
22
|
+
if (typeof constraints !== 'object') {
|
|
23
|
+
return Promise.reject(new TypeError('constraints is not a dictionary'));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (
|
|
27
|
+
(typeof constraints.audio === 'undefined' || !constraints.audio) &&
|
|
28
|
+
(typeof constraints.video === 'undefined' || !constraints.video)
|
|
29
|
+
) {
|
|
30
|
+
return Promise.reject(new TypeError('audio and/or video is required'));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Normalize constraints.
|
|
34
|
+
constraints = RTCUtil.normalizeConstraints(constraints);
|
|
35
|
+
|
|
36
|
+
// Request required permissions
|
|
37
|
+
const reqPermissions: Promise<boolean>[] = [];
|
|
38
|
+
|
|
39
|
+
if (constraints.audio) {
|
|
40
|
+
reqPermissions.push(permissions.request({ name: 'microphone' }));
|
|
41
|
+
} else {
|
|
42
|
+
reqPermissions.push(Promise.resolve(false));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (constraints.video) {
|
|
46
|
+
reqPermissions.push(permissions.request({ name: 'camera' }));
|
|
47
|
+
} else {
|
|
48
|
+
reqPermissions.push(Promise.resolve(false));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
Promise.all(reqPermissions).then(results => {
|
|
53
|
+
const [ audioPerm, videoPerm ] = results;
|
|
54
|
+
|
|
55
|
+
// Check permission results and remove unneeded permissions.
|
|
56
|
+
|
|
57
|
+
if (!audioPerm && !videoPerm) {
|
|
58
|
+
// https://www.w3.org/TR/mediacapture-streams/#dom-mediadevices-getusermedia
|
|
59
|
+
// step 4
|
|
60
|
+
const error = {
|
|
61
|
+
message: 'Permission denied.',
|
|
62
|
+
name: 'SecurityError'
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
reject(new MediaStreamError(error));
|
|
66
|
+
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
audioPerm || delete constraints.audio;
|
|
71
|
+
videoPerm || delete constraints.video;
|
|
72
|
+
|
|
73
|
+
const success = (id, tracks) => {
|
|
74
|
+
// Store initial constraints.
|
|
75
|
+
for (const trackInfo of tracks) {
|
|
76
|
+
const c = constraints[trackInfo.kind];
|
|
77
|
+
|
|
78
|
+
if (typeof c === 'object') {
|
|
79
|
+
trackInfo.constraints = RTCUtil.deepClone(c);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const info = {
|
|
84
|
+
streamId: id,
|
|
85
|
+
streamReactTag: id,
|
|
86
|
+
tracks
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
resolve(new MediaStream(info));
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const failure = (type, message) => {
|
|
93
|
+
let error;
|
|
94
|
+
|
|
95
|
+
switch (type) {
|
|
96
|
+
case 'TypeError':
|
|
97
|
+
error = new TypeError(message);
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (!error) {
|
|
102
|
+
error = new MediaStreamError({ message, name: type });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
reject(error);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
WebRTCModule.getUserMedia(constraints, success, failure);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { NativeModules, Platform } from 'react-native';
|
|
2
|
+
const { WebRTCModule } = NativeModules;
|
|
3
|
+
|
|
4
|
+
if (WebRTCModule === null) {
|
|
5
|
+
throw new Error(`WebRTC native module not found.\n${Platform.OS === 'ios' ?
|
|
6
|
+
'Try executing the "pod install" command inside your projects ios folder.' :
|
|
7
|
+
'Try executing the "npm install" command inside your projects folder.'
|
|
8
|
+
}`);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
import { setupNativeEvents } from './EventEmitter';
|
|
12
|
+
import Logger from './Logger';
|
|
13
|
+
import mediaDevices from './MediaDevices';
|
|
14
|
+
import MediaStream from './MediaStream';
|
|
15
|
+
import MediaStreamTrack, {
|
|
16
|
+
type MediaTrackSettings,
|
|
17
|
+
type PalabraConfig,
|
|
18
|
+
type PalabraTranscription,
|
|
19
|
+
} from './MediaStreamTrack';
|
|
20
|
+
import MediaStreamTrackEvent from './MediaStreamTrackEvent';
|
|
21
|
+
import permissions from './Permissions';
|
|
22
|
+
import RTCAudioSession from './RTCAudioSession';
|
|
23
|
+
import RTCDataPacketCryptor, { RTCEncryptedPacket } from './RTCDataPacketCryptor';
|
|
24
|
+
import RTCDataPacketCryptorFactory from './RTCDataPacketCryptorFactory';
|
|
25
|
+
import RTCErrorEvent from './RTCErrorEvent';
|
|
26
|
+
import RTCFrameCryptor, { RTCFrameCryptorState } from './RTCFrameCryptor';
|
|
27
|
+
import RTCFrameCryptorFactory, { RTCFrameCryptorAlgorithm, RTCKeyProviderOptions } from './RTCFrameCryptorFactory';
|
|
28
|
+
import RTCIceCandidate from './RTCIceCandidate';
|
|
29
|
+
import RTCKeyProvider from './RTCKeyProvider';
|
|
30
|
+
import RTCPIPView, { startIOSPIP, stopIOSPIP } from './RTCPIPView';
|
|
31
|
+
import RTCPeerConnection from './RTCPeerConnection';
|
|
32
|
+
import RTCRtpReceiver from './RTCRtpReceiver';
|
|
33
|
+
import RTCRtpSender from './RTCRtpSender';
|
|
34
|
+
import RTCRtpTransceiver from './RTCRtpTransceiver';
|
|
35
|
+
import RTCSessionDescription from './RTCSessionDescription';
|
|
36
|
+
import RTCView, { type RTCVideoViewProps, type RTCIOSPIPOptions } from './RTCView';
|
|
37
|
+
import ScreenCapturePickerView from './ScreenCapturePickerView';
|
|
38
|
+
|
|
39
|
+
Logger.enable(`${Logger.ROOT_PREFIX}:*`);
|
|
40
|
+
|
|
41
|
+
// Add listeners for the native events early, since they are added asynchronously.
|
|
42
|
+
setupNativeEvents();
|
|
43
|
+
|
|
44
|
+
export {
|
|
45
|
+
RTCIceCandidate,
|
|
46
|
+
RTCPeerConnection,
|
|
47
|
+
RTCSessionDescription,
|
|
48
|
+
RTCView,
|
|
49
|
+
RTCPIPView,
|
|
50
|
+
ScreenCapturePickerView,
|
|
51
|
+
RTCRtpTransceiver,
|
|
52
|
+
RTCRtpReceiver,
|
|
53
|
+
RTCRtpSender,
|
|
54
|
+
RTCErrorEvent,
|
|
55
|
+
RTCAudioSession,
|
|
56
|
+
RTCDataPacketCryptor,
|
|
57
|
+
RTCDataPacketCryptorFactory,
|
|
58
|
+
RTCEncryptedPacket,
|
|
59
|
+
RTCFrameCryptor,
|
|
60
|
+
RTCFrameCryptorAlgorithm,
|
|
61
|
+
RTCFrameCryptorState,
|
|
62
|
+
RTCFrameCryptorFactory,
|
|
63
|
+
RTCKeyProvider,
|
|
64
|
+
RTCKeyProviderOptions,
|
|
65
|
+
MediaStream,
|
|
66
|
+
MediaStreamTrack,
|
|
67
|
+
type MediaTrackSettings,
|
|
68
|
+
type PalabraConfig,
|
|
69
|
+
type PalabraTranscription,
|
|
70
|
+
type RTCVideoViewProps,
|
|
71
|
+
type RTCIOSPIPOptions,
|
|
72
|
+
mediaDevices,
|
|
73
|
+
permissions,
|
|
74
|
+
registerGlobals,
|
|
75
|
+
startIOSPIP,
|
|
76
|
+
stopIOSPIP,
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
declare const global: any;
|
|
80
|
+
|
|
81
|
+
function registerGlobals(): void {
|
|
82
|
+
// Should not happen. React Native has a global navigator object.
|
|
83
|
+
if (typeof global.navigator !== 'object') {
|
|
84
|
+
throw new Error('navigator is not an object');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (!global.navigator.mediaDevices) {
|
|
88
|
+
global.navigator.mediaDevices = {};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
global.navigator.mediaDevices.getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);
|
|
92
|
+
global.navigator.mediaDevices.getDisplayMedia = mediaDevices.getDisplayMedia.bind(mediaDevices);
|
|
93
|
+
global.navigator.mediaDevices.enumerateDevices = mediaDevices.enumerateDevices.bind(mediaDevices);
|
|
94
|
+
|
|
95
|
+
global.RTCIceCandidate = RTCIceCandidate;
|
|
96
|
+
global.RTCPeerConnection = RTCPeerConnection;
|
|
97
|
+
global.RTCRtpReceiver = RTCRtpReceiver;
|
|
98
|
+
global.RTCRtpSender = RTCRtpReceiver;
|
|
99
|
+
global.RTCSessionDescription = RTCSessionDescription;
|
|
100
|
+
global.MediaStream = MediaStream;
|
|
101
|
+
global.MediaStreamTrack = MediaStreamTrack;
|
|
102
|
+
global.MediaStreamTrackEvent = MediaStreamTrackEvent;
|
|
103
|
+
global.RTCRtpTransceiver = RTCRtpTransceiver;
|
|
104
|
+
global.RTCRtpReceiver = RTCRtpReceiver;
|
|
105
|
+
global.RTCRtpSender = RTCRtpSender;
|
|
106
|
+
global.RTCErrorEvent = RTCErrorEvent;
|
|
107
|
+
}
|