react-native-webrtc-nitro 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/android/src/main/java/com/webrtc/HybridCamera.kt +0 -1
  2. package/android/src/main/java/com/webrtc/HybridMicrophone.kt +0 -1
  3. package/android/src/main/java/com/webrtc/HybridPermissions.kt +95 -0
  4. package/cpp/FFmpeg/Muxer.cpp +1 -1
  5. package/cpp/Hybrid/HybridMediaDevices.cpp +23 -19
  6. package/cpp/Hybrid/HybridMediaRecorder.cpp +118 -0
  7. package/cpp/Hybrid/HybridMediaRecorder.hpp +36 -0
  8. package/cpp/__tests__/FFmpeg/testMuxer.cpp +18 -32
  9. package/ios/HybridCamera.swift +1 -3
  10. package/ios/HybridMicrophone.swift +1 -3
  11. package/ios/HybridPermissions.swift +63 -0
  12. package/lib/commonjs/index.js +22 -0
  13. package/lib/commonjs/index.js.map +1 -1
  14. package/lib/commonjs/specs/MediaRecorder.nitro.js +16 -0
  15. package/lib/commonjs/specs/MediaRecorder.nitro.js.map +1 -0
  16. package/lib/commonjs/specs/Permissions.nitro.js +9 -0
  17. package/lib/commonjs/specs/Permissions.nitro.js.map +1 -0
  18. package/lib/module/index.js +2 -0
  19. package/lib/module/index.js.map +1 -1
  20. package/lib/module/specs/MediaRecorder.nitro.js +13 -0
  21. package/lib/module/specs/MediaRecorder.nitro.js.map +1 -0
  22. package/lib/module/specs/Permissions.nitro.js +6 -0
  23. package/lib/module/specs/Permissions.nitro.js.map +1 -0
  24. package/lib/typescript/src/index.d.ts +2 -0
  25. package/lib/typescript/src/index.d.ts.map +1 -1
  26. package/lib/typescript/src/specs/MediaRecorder.nitro.d.ts +17 -0
  27. package/lib/typescript/src/specs/MediaRecorder.nitro.d.ts.map +1 -0
  28. package/lib/typescript/src/specs/Permissions.nitro.d.ts +17 -0
  29. package/lib/typescript/src/specs/Permissions.nitro.d.ts.map +1 -0
  30. package/nitro.json +7 -0
  31. package/nitrogen/generated/android/Webrtc+autolinking.cmake +3 -0
  32. package/nitrogen/generated/android/WebrtcOnLoad.cpp +20 -0
  33. package/nitrogen/generated/android/c++/JHybridPermissionsSpec.cpp +91 -0
  34. package/nitrogen/generated/android/c++/JHybridPermissionsSpec.hpp +66 -0
  35. package/nitrogen/generated/android/c++/JPermissionDescriptor.hpp +58 -0
  36. package/nitrogen/generated/android/c++/JPermissionName.hpp +59 -0
  37. package/nitrogen/generated/android/c++/JPermissionState.hpp +62 -0
  38. package/nitrogen/generated/android/kotlin/com/margelo/nitro/webrtc/HybridPermissionsSpec.kt +62 -0
  39. package/nitrogen/generated/android/kotlin/com/margelo/nitro/webrtc/PermissionDescriptor.kt +38 -0
  40. package/nitrogen/generated/android/kotlin/com/margelo/nitro/webrtc/PermissionName.kt +21 -0
  41. package/nitrogen/generated/android/kotlin/com/margelo/nitro/webrtc/PermissionState.kt +22 -0
  42. package/nitrogen/generated/ios/Webrtc-Swift-Cxx-Bridge.cpp +25 -0
  43. package/nitrogen/generated/ios/Webrtc-Swift-Cxx-Bridge.hpp +63 -0
  44. package/nitrogen/generated/ios/Webrtc-Swift-Cxx-Umbrella.hpp +14 -0
  45. package/nitrogen/generated/ios/WebrtcAutolinking.mm +18 -0
  46. package/nitrogen/generated/ios/WebrtcAutolinking.swift +15 -0
  47. package/nitrogen/generated/ios/c++/HybridPermissionsSpecSwift.cpp +11 -0
  48. package/nitrogen/generated/ios/c++/HybridPermissionsSpecSwift.hpp +92 -0
  49. package/nitrogen/generated/ios/swift/Func_void_PermissionState.swift +47 -0
  50. package/nitrogen/generated/ios/swift/HybridPermissionsSpec.swift +57 -0
  51. package/nitrogen/generated/ios/swift/HybridPermissionsSpec_cxx.swift +157 -0
  52. package/nitrogen/generated/ios/swift/PermissionDescriptor.swift +36 -0
  53. package/nitrogen/generated/ios/swift/PermissionName.swift +40 -0
  54. package/nitrogen/generated/ios/swift/PermissionState.swift +44 -0
  55. package/nitrogen/generated/shared/c++/HybridMediaRecorderSpec.cpp +25 -0
  56. package/nitrogen/generated/shared/c++/HybridMediaRecorderSpec.hpp +69 -0
  57. package/nitrogen/generated/shared/c++/HybridPermissionsSpec.cpp +22 -0
  58. package/nitrogen/generated/shared/c++/HybridPermissionsSpec.hpp +68 -0
  59. package/nitrogen/generated/shared/c++/PermissionDescriptor.hpp +76 -0
  60. package/nitrogen/generated/shared/c++/PermissionName.hpp +76 -0
  61. package/nitrogen/generated/shared/c++/PermissionState.hpp +80 -0
  62. package/package.json +4 -5
  63. package/src/index.ts +2 -0
  64. package/src/specs/MediaRecorder.nitro.ts +24 -0
  65. package/src/specs/Permissions.nitro.ts +22 -0
  66. package/android/src/main/java/com/webrtc/Permission.kt +0 -58
  67. package/ios/Permission.swift +0 -26
@@ -154,7 +154,6 @@ class HybridCamera : HybridCameraSpec() {
154
154
  override fun open(pipeId: String): Promise<Unit> {
155
155
  this.pipeId = pipeId
156
156
  return Promise.async {
157
- requestPermission(android.Manifest.permission.CAMERA)
158
157
  Camera.addPipeId(pipeId)
159
158
  }
160
159
  }
@@ -35,7 +35,6 @@ class HybridMicrophone : HybridMicrophoneSpec() {
35
35
  override fun open(pipeId: String): Promise<Unit> {
36
36
  this.pipeId = pipeId
37
37
  return Promise.async {
38
- requestPermission(android.Manifest.permission.RECORD_AUDIO)
39
38
 
40
39
  audioRecord = AudioRecord(
41
40
  MediaRecorder.AudioSource.VOICE_COMMUNICATION,
@@ -0,0 +1,95 @@
1
+ package com.webrtc
2
+
3
+ import android.content.pm.PackageManager
4
+ import androidx.core.content.ContextCompat
5
+ import androidx.annotation.Keep
6
+ import com.facebook.react.modules.core.PermissionAwareActivity
7
+ import com.facebook.react.modules.core.PermissionListener
8
+ import com.facebook.proguard.annotations.DoNotStrip
9
+ import kotlin.random.Random
10
+ import kotlinx.coroutines.CompletableDeferred
11
+ import kotlinx.coroutines.Dispatchers
12
+ import kotlinx.coroutines.withContext
13
+ import com.margelo.nitro.NitroModules
14
+ import com.margelo.nitro.core.Promise
15
+ import com.margelo.nitro.webrtc.HybridPermissionsSpec
16
+ import com.margelo.nitro.webrtc.PermissionDescriptor
17
+ import com.margelo.nitro.webrtc.PermissionState
18
+ import com.margelo.nitro.webrtc.PermissionName
19
+
20
+ @Keep
21
+ @DoNotStrip
22
+ class HybridPermissions : HybridPermissionsSpec() {
23
+
24
+ override fun query(permissionDesc: PermissionDescriptor): Promise<PermissionState> {
25
+ return Promise.async {
26
+ val permission = when (permissionDesc.name) {
27
+ PermissionName.MICROPHONE -> android.Manifest.permission.RECORD_AUDIO
28
+ PermissionName.CAMERA -> android.Manifest.permission.CAMERA
29
+ }
30
+
31
+ val context = NitroModules.applicationContext
32
+ ?: throw RuntimeException("ReactApplicationContext is not available")
33
+
34
+ val currentActivity = context.currentActivity
35
+ ?: throw RuntimeException("No current Activity")
36
+ val status = ContextCompat.checkSelfPermission(context, permission)
37
+
38
+ if (status == PackageManager.PERMISSION_GRANTED) {
39
+ PermissionState.GRANTED
40
+ } else if (status == PackageManager.PERMISSION_DENIED && !currentActivity.shouldShowRequestPermissionRationale(
41
+ permission
42
+ )
43
+ ) {
44
+ PermissionState.PROMPT
45
+ } else {
46
+ PermissionState.DENIED
47
+ }
48
+ }
49
+ }
50
+
51
+ override fun request(permissionDesc: PermissionDescriptor): Promise<PermissionState> {
52
+ return Promise.async {
53
+ val permission = when (permissionDesc.name) {
54
+ PermissionName.MICROPHONE -> android.Manifest.permission.RECORD_AUDIO
55
+ PermissionName.CAMERA -> android.Manifest.permission.CAMERA
56
+ }
57
+
58
+ val context = NitroModules.applicationContext
59
+ ?: throw RuntimeException("ReactApplicationContext is not available")
60
+
61
+ val currentActivity = context.currentActivity
62
+ ?: throw RuntimeException("No current Activity")
63
+
64
+ if (currentActivity !is PermissionAwareActivity) {
65
+ throw RuntimeException("Current activity doesn't support permissions")
66
+ }
67
+
68
+ val code = Random.nextInt(0, 1000)
69
+ val deferred = CompletableDeferred<PermissionState>()
70
+
71
+ val listener = object : PermissionListener {
72
+ override fun onRequestPermissionsResult(
73
+ requestCode: Int,
74
+ permissions: Array<String>,
75
+ grantResults: IntArray
76
+ ): Boolean {
77
+ if (requestCode != code) return false
78
+
79
+ if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
80
+ deferred.complete(PermissionState.GRANTED)
81
+ } else {
82
+ deferred.complete(PermissionState.DENIED)
83
+ }
84
+ return true
85
+ }
86
+ }
87
+
88
+ withContext(Dispatchers.Main) {
89
+ currentActivity.requestPermissions(arrayOf(permission), code, listener)
90
+ }
91
+
92
+ deferred.await()
93
+ }
94
+ }
95
+ }
@@ -85,7 +85,7 @@ void Muxer::tryWriteVideo ()
85
85
  {
86
86
  return;
87
87
  }
88
- std::vector<Packet> packets = audioEncoder.receive ();
88
+ std::vector<Packet> packets = videoEncoder.receive ();
89
89
  for (Packet &packet : packets)
90
90
  {
91
91
  packet->stream_index = videoStream->index;
@@ -10,25 +10,29 @@ auto
10
10
  HybridMediaDevices::getMockMedia (const MediaStreamConstraints &constraints)
11
11
  -> std::shared_ptr<Promise<std::shared_ptr<HybridMediaStreamSpec>>>
12
12
  {
13
- auto hybridMediaStreams = std::make_shared<HybridMediaStream> ();
14
- if (constraints.audio.value_or (false))
15
- {
16
- auto hybridAudioTrack
17
- = std::make_shared<HybridMediaStreamTrack> ("audio");
18
- hybridAudioTrack->mockMicrophone = std::make_shared<MockMicrophone> (
19
- hybridAudioTrack->get_srcPipeId ());
20
- hybridMediaStreams->addTrack (hybridAudioTrack);
21
- }
22
- if (constraints.video.value_or (false))
23
- {
24
- auto hybridVideoTrack
25
- = std::make_shared<HybridMediaStreamTrack> ("video");
26
- hybridVideoTrack->mockCamera = std::make_shared<MockCamera> (
27
- hybridVideoTrack->get_srcPipeId ());
28
- hybridMediaStreams->addTrack (hybridVideoTrack);
29
- }
30
- return Promise<std::shared_ptr<HybridMediaStreamSpec>>::resolved (
31
- hybridMediaStreams);
13
+ return Promise<std::shared_ptr<HybridMediaStreamSpec>>::async (
14
+ [constraints] ()
15
+ {
16
+ auto hybridMediaStreams = std::make_shared<HybridMediaStream> ();
17
+ if (constraints.audio.value_or (false))
18
+ {
19
+ auto hybridAudioTrack
20
+ = std::make_shared<HybridMediaStreamTrack> ("audio");
21
+ hybridAudioTrack->mockMicrophone
22
+ = std::make_shared<MockMicrophone> (
23
+ hybridAudioTrack->get_srcPipeId ());
24
+ hybridMediaStreams->addTrack (hybridAudioTrack);
25
+ }
26
+ if (constraints.video.value_or (false))
27
+ {
28
+ auto hybridVideoTrack
29
+ = std::make_shared<HybridMediaStreamTrack> ("video");
30
+ hybridVideoTrack->mockCamera = std::make_shared<MockCamera> (
31
+ hybridVideoTrack->get_srcPipeId ());
32
+ hybridMediaStreams->addTrack (hybridVideoTrack);
33
+ }
34
+ return hybridMediaStreams;
35
+ });
32
36
  };
33
37
 
34
38
  auto
@@ -0,0 +1,118 @@
1
+ #include "HybridMediaRecorder.hpp"
2
+ #include "FramePipe.hpp"
3
+ #include <filesystem>
4
+
5
+ using namespace margelo::nitro::webrtc;
6
+
7
+ auto HybridMediaRecorder::takePhoto (const std::string &file)
8
+ -> std::shared_ptr<Promise<void>>
9
+ {
10
+ if (mediaStream == nullptr)
11
+ {
12
+ throw std::runtime_error (
13
+ "MediaStream is not set for HybridMediaRecorder");
14
+ }
15
+
16
+ if (std::filesystem::path (file).extension () != ".png")
17
+ {
18
+ throw std::invalid_argument ("Only .png format is supported");
19
+ }
20
+
21
+ auto tracks = mediaStream->getVideoTracks ();
22
+ if (tracks.empty ())
23
+ {
24
+ throw std::runtime_error ("No video tracks available in MediaStream");
25
+ }
26
+ std::string srcPipeId = tracks[0]->get_srcPipeId ();
27
+ return Promise<void>::async (
28
+ [this, srcPipeId, file] () -> void
29
+ {
30
+ auto encoder = std::make_shared<FFmpeg::Encoder> (AV_CODEC_ID_PNG);
31
+ FrameCallback callback =
32
+ [this, encoder, file] (const std::string &, int subscriptionId,
33
+ const FFmpeg::Frame &frame)
34
+ {
35
+ FILE *f = fopen (file.c_str (), "wb");
36
+ if (!f)
37
+ {
38
+ throw std::invalid_argument ("Failed to open file " + file
39
+ + " for writing");
40
+ }
41
+ encoder->send (frame);
42
+ encoder->flush ();
43
+ for (const FFmpeg::Packet &packet : encoder->receive ())
44
+ {
45
+ fwrite (packet->data, 1, packet->size, f);
46
+ }
47
+ fclose (f);
48
+ ::unsubscribe (subscriptionId);
49
+ this->subscriptionId = -1;
50
+ };
51
+
52
+ this->subscriptionId
53
+ = subscribe ({ srcPipeId }, callback, nullptr);
54
+
55
+ // wait for the callback to be called
56
+ while (this->subscriptionId != -1)
57
+ {
58
+ std::this_thread::sleep_for (std::chrono::milliseconds (10));
59
+ }
60
+ });
61
+ }
62
+
63
+ void HybridMediaRecorder::startRecording (const std::string &file)
64
+ {
65
+ if (mediaStream == nullptr)
66
+ {
67
+ throw std::runtime_error (
68
+ "MediaStream is not set for HybridMediaRecorder");
69
+ }
70
+
71
+ if (std::filesystem::path (file).extension () != ".mp4")
72
+ {
73
+ throw std::invalid_argument ("Only .mp4 format is supported c++");
74
+ }
75
+ AVCodecID audioCodecId = AV_CODEC_ID_NONE;
76
+ AVCodecID videoCodecId = AV_CODEC_ID_NONE;
77
+ std::string audioPipeId = "";
78
+ std::string videoPipeId = "";
79
+ std::vector<std::string> pipeIds;
80
+ if (!mediaStream->getAudioTracks ().empty ())
81
+ {
82
+ audioPipeId = mediaStream->getAudioTracks ()[0]->get_srcPipeId ();
83
+ pipeIds.push_back (audioPipeId);
84
+ audioCodecId = AV_CODEC_ID_AAC;
85
+ }
86
+ if (!mediaStream->getVideoTracks ().empty ())
87
+ {
88
+ videoPipeId = mediaStream->getVideoTracks ()[0]->get_srcPipeId ();
89
+ pipeIds.push_back (videoPipeId);
90
+ videoCodecId = AV_CODEC_ID_H264;
91
+ }
92
+
93
+ auto muxer
94
+ = std::make_shared<FFmpeg::Muxer> (file, audioCodecId, videoCodecId);
95
+ FrameCallback callback
96
+ = [muxer, audioPipeId, videoPipeId] (const std::string &pipeId, int,
97
+ const FFmpeg::Frame &frame)
98
+ {
99
+ if (pipeId == audioPipeId)
100
+ {
101
+ muxer->writeAudio (frame);
102
+ }
103
+ if (pipeId == videoPipeId)
104
+ {
105
+ muxer->writeVideo (frame);
106
+ }
107
+ };
108
+
109
+ CleanupCallback cleanup = [muxer] (int) { muxer->stop (); };
110
+
111
+ subscriptionId = subscribe (pipeIds, callback, cleanup);
112
+ }
113
+
114
+ void HybridMediaRecorder::stopRecording ()
115
+ {
116
+ unsubscribe (subscriptionId);
117
+ subscriptionId = -1;
118
+ }
@@ -0,0 +1,36 @@
1
+ #pragma once
2
+ #include "HybridMediaRecorderSpec.hpp"
3
+ #include "HybridMediaStream.hpp"
4
+ #include <NitroModules/Promise.hpp>
5
+
6
+ namespace margelo::nitro::webrtc
7
+ {
8
+ class HybridMediaRecorder : public HybridMediaRecorderSpec
9
+ {
10
+ private:
11
+ std::shared_ptr<HybridMediaStream> mediaStream = nullptr;
12
+ int subscriptionId = -1;
13
+
14
+ public:
15
+ HybridMediaRecorder () : HybridObject (TAG), HybridMediaRecorderSpec ()
16
+ {
17
+ }
18
+
19
+ auto getStream () -> std::shared_ptr<HybridMediaStreamSpec> override
20
+ {
21
+ return mediaStream;
22
+ }
23
+
24
+ void setStream (
25
+ const std::shared_ptr<HybridMediaStreamSpec> &mediaStream) override
26
+ {
27
+ this->mediaStream
28
+ = std::dynamic_pointer_cast<HybridMediaStream> (mediaStream);
29
+ }
30
+
31
+ auto takePhoto (const std::string &file)
32
+ -> std::shared_ptr<Promise<void>> override;
33
+ void startRecording (const std::string &file) override;
34
+ void stopRecording () override;
35
+ };
36
+ } // namespace margelo::nitro::webrtc
@@ -11,13 +11,16 @@ constexpr int HEIGHT = 480;
11
11
 
12
12
  TEST (MuxerTest, testMuxerAAC)
13
13
  {
14
- std::string file = testing::TempDir () + "/test_file.mp4";
14
+ std::string file = "test_aac.mp4";
15
15
  Muxer muxer (file, AV_CODEC_ID_AAC, AV_CODEC_ID_NONE);
16
16
 
17
- Frame inputFrame (AV_SAMPLE_FMT_FLT, AUDIO_SAMPLE_RATE, 1,
18
- AUDIO_NB_SAMPLES);
19
- inputFrame.fillNoise ();
20
- muxer.writeAudio (inputFrame);
17
+ for (int i = 0; i < 1000; ++i)
18
+ {
19
+ Frame inputFrame (AV_SAMPLE_FMT_FLT, AUDIO_SAMPLE_RATE, 1,
20
+ AUDIO_NB_SAMPLES, i * AUDIO_NB_SAMPLES);
21
+ inputFrame.fillNoise ();
22
+ muxer.writeAudio (inputFrame);
23
+ }
21
24
  muxer.stop ();
22
25
 
23
26
  EXPECT_TRUE (std::filesystem::exists (file));
@@ -25,46 +28,29 @@ TEST (MuxerTest, testMuxerAAC)
25
28
 
26
29
  TEST (MuxerTest, testMuxerH264)
27
30
  {
28
- std::string file = testing::TempDir () + "/test_file.mp4";
29
-
31
+ std::string file = "test_h264.mp4";
30
32
  Muxer muxer (file, AV_CODEC_ID_NONE, AV_CODEC_ID_H264);
31
- Frame inputFrame (AV_PIX_FMT_NV12, WIDTH, HEIGHT);
32
- inputFrame.fillNoise ();
33
- muxer.writeVideo (inputFrame);
34
- muxer.stop ();
35
-
36
- EXPECT_TRUE (std::filesystem::exists (file));
37
- }
38
-
39
- TEST (MuxerTest, testMuxerVideo)
40
- {
41
- std::string file = testing::TempDir () + "/test_file.mp4";
42
- Muxer muxer (file, AV_CODEC_ID_AAC, AV_CODEC_ID_H264);
43
-
44
- Frame audioFrame (AV_SAMPLE_FMT_FLT, AUDIO_SAMPLE_RATE, 1,
45
- AUDIO_NB_SAMPLES);
46
- Frame videoFrame (AV_PIX_FMT_NV12, WIDTH, HEIGHT);
47
- audioFrame.fillNoise ();
48
- videoFrame.fillNoise ();
49
- muxer.writeAudio (audioFrame);
50
- muxer.writeVideo (videoFrame);
51
33
 
34
+ for (int i = 0; i < 1000; ++i)
35
+ {
36
+ Frame inputFrame (AV_PIX_FMT_NV12, WIDTH, HEIGHT, i * 3000);
37
+ inputFrame.fillNoise ();
38
+ muxer.writeVideo (inputFrame);
39
+ }
52
40
  muxer.stop ();
53
41
  EXPECT_TRUE (std::filesystem::exists (file));
54
42
  }
55
43
 
56
- TEST (MuxerTest, testSaveMp4)
44
+ TEST (MuxerTest, testMuxerVideo)
57
45
  {
58
46
  std::string file = "output.mp4";
59
47
  Muxer muxer (file, AV_CODEC_ID_AAC, AV_CODEC_ID_H264);
60
- constexpr int LOOPS = 1000;
61
- constexpr int VIDEO_SAMPLES = 3000;
62
48
 
63
- for (int i = 0; i < LOOPS; ++i)
49
+ for (int i = 0; i < 1000; ++i)
64
50
  {
65
51
  Frame audioFrame (AV_SAMPLE_FMT_FLT, AUDIO_SAMPLE_RATE, 1,
66
52
  AUDIO_NB_SAMPLES, i * AUDIO_NB_SAMPLES);
67
- Frame videoFrame (AV_PIX_FMT_NV12, WIDTH, HEIGHT, i * VIDEO_SAMPLES);
53
+ Frame videoFrame (AV_PIX_FMT_NV12, WIDTH, HEIGHT, i * 3000);
68
54
  audioFrame.fillNoise ();
69
55
  videoFrame.fillNoise ();
70
56
  muxer.writeAudio (audioFrame);
@@ -95,10 +95,8 @@ public class HybridCamera: HybridCameraSpec {
95
95
  throw RuntimeError.error(withMessage: "Pipe ID cannot be empty")
96
96
  }
97
97
 
98
- try cameraManager.prepare()
99
-
100
98
  return Promise.async {
101
- try await requestPermission(for: .video)
99
+ try self.cameraManager.prepare()
102
100
  self.pipeId = pipeId
103
101
  self.cameraManager.addActivePipeId(pipeId)
104
102
  }
@@ -87,10 +87,8 @@ public class HybridMicrophone: HybridMicrophoneSpec {
87
87
  throw RuntimeError.error(withMessage: "Pipe ID cannot be empty")
88
88
  }
89
89
 
90
- try microphoneManager.prepare()
91
-
92
90
  return Promise.async {
93
- try await requestPermission(for: .audio)
91
+ try self.microphoneManager.prepare()
94
92
  self.pipeId = pipeId
95
93
  self.microphoneManager.addActivePipeId(pipeId)
96
94
  }
@@ -0,0 +1,63 @@
1
+ //
2
+ // HybridPermissions.swift
3
+ // Pods
4
+ //
5
+ // Created by kaizhi-singtown on 2025/11/27.
6
+ //
7
+
8
+ import Foundation
9
+ import NitroModules
10
+
11
+ public class HybridPermissions: HybridPermissionsSpec {
12
+ public func query(permissionDesc: PermissionDescriptor) throws -> Promise<PermissionState> {
13
+ return Promise.async {
14
+
15
+ let mediaType: AVMediaType
16
+ switch permissionDesc.name {
17
+ case .camera:
18
+ mediaType = .video
19
+ case .microphone:
20
+ mediaType = .audio
21
+ default:
22
+ return .denied
23
+ }
24
+
25
+ let status = AVCaptureDevice.authorizationStatus(for: mediaType)
26
+ switch status {
27
+ case .authorized:
28
+ return .granted
29
+ case .denied, .restricted:
30
+ return .denied
31
+ case .notDetermined:
32
+ return .prompt
33
+ @unknown default:
34
+ return .denied
35
+ }
36
+ }
37
+ }
38
+
39
+ public func request(permissionDesc: PermissionDescriptor) throws -> Promise<PermissionState> {
40
+ return Promise.async {
41
+ let mediaType: AVMediaType
42
+ switch permissionDesc.name {
43
+ case .camera:
44
+ mediaType = .video
45
+ case .microphone:
46
+ mediaType = .audio
47
+ default:
48
+ return .denied
49
+ }
50
+
51
+ let granted = await withCheckedContinuation { (continuation) in
52
+ AVCaptureDevice.requestAccess(for: mediaType) { ok in
53
+ continuation.resume(returning: ok)
54
+ }
55
+ }
56
+ if granted {
57
+ return .granted
58
+ } else {
59
+ return .denied
60
+ }
61
+ }
62
+ }
63
+ }
@@ -14,6 +14,17 @@ Object.keys(_WebrtcView).forEach(function (key) {
14
14
  }
15
15
  });
16
16
  });
17
+ var _Permissions = require("./specs/Permissions.nitro");
18
+ Object.keys(_Permissions).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _Permissions[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _Permissions[key];
25
+ }
26
+ });
27
+ });
17
28
  var _MediaDevices = require("./specs/MediaDevices.nitro");
18
29
  Object.keys(_MediaDevices).forEach(function (key) {
19
30
  if (key === "default" || key === "__esModule") return;
@@ -91,4 +102,15 @@ Object.keys(_RTCRtpTransceiver).forEach(function (key) {
91
102
  }
92
103
  });
93
104
  });
105
+ var _MediaRecorder = require("./specs/MediaRecorder.nitro");
106
+ Object.keys(_MediaRecorder).forEach(function (key) {
107
+ if (key === "default" || key === "__esModule") return;
108
+ if (key in exports && exports[key] === _MediaRecorder[key]) return;
109
+ Object.defineProperty(exports, key, {
110
+ enumerable: true,
111
+ get: function () {
112
+ return _MediaRecorder[key];
113
+ }
114
+ });
115
+ });
94
116
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_WebrtcView","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_MediaDevices","_MediaStream","_MediaStreamTrack","_RTCPeerConnection","_RTCRtpSender","_RTCRtpReceiver","_RTCRtpTransceiver"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_WebrtcView","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_Permissions","_MediaDevices","_MediaStream","_MediaStreamTrack","_RTCPeerConnection","_RTCRtpSender","_RTCRtpReceiver","_RTCRtpTransceiver","_MediaRecorder"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.MediaRecorder = void 0;
7
+ var _reactNativeNitroModules = require("react-native-nitro-modules");
8
+ const MediaRecorderConstructor = (0, _reactNativeNitroModules.getHybridObjectConstructor)('MediaRecorder');
9
+ const MediaRecorderExport = exports.MediaRecorder = new Proxy(MediaRecorderConstructor, {
10
+ construct(target, args) {
11
+ const instance = new target();
12
+ instance.stream = args[0];
13
+ return instance;
14
+ }
15
+ });
16
+ //# sourceMappingURL=MediaRecorder.nitro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNativeNitroModules","require","MediaRecorderConstructor","getHybridObjectConstructor","MediaRecorderExport","exports","MediaRecorder","Proxy","construct","target","args","instance","stream"],"sourceRoot":"../../../src","sources":["specs/MediaRecorder.nitro.ts"],"mappings":";;;;;;AACA,IAAAA,wBAAA,GAAAC,OAAA;AAUA,MAAMC,wBAAwB,GAC5B,IAAAC,mDAA0B,EAAgB,eAAe,CAAC;AAE5D,MAAMC,mBAAmB,GAAAC,OAAA,CAAAC,aAAA,GAAG,IAAIC,KAAK,CAACL,wBAAwB,EAAE;EAC9DM,SAASA,CAACC,MAAM,EAAEC,IAAI,EAAE;IACtB,MAAMC,QAAQ,GAAG,IAAIF,MAAM,CAAC,CAAC;IAC7BE,QAAQ,CAACC,MAAM,GAAGF,IAAI,CAAC,CAAC,CAAgB;IACxC,OAAOC,QAAQ;EACjB;AACF,CAAC,CAAiD","ignoreList":[]}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Permissions = void 0;
7
+ var _reactNativeNitroModules = require("react-native-nitro-modules");
8
+ const PermissionsExport = exports.Permissions = _reactNativeNitroModules.NitroModules.createHybridObject('Permissions');
9
+ //# sourceMappingURL=Permissions.nitro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNativeNitroModules","require","PermissionsExport","exports","Permissions","NitroModules","createHybridObject"],"sourceRoot":"../../../src","sources":["specs/Permissions.nitro.ts"],"mappings":";;;;;;AACA,IAAAA,wBAAA,GAAAC,OAAA;AAiBA,MAAMC,iBAAiB,GAAAC,OAAA,CAAAC,WAAA,GACrBC,qCAAY,CAACC,kBAAkB,CAAc,aAAa,CAAC","ignoreList":[]}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  export * from './views/WebrtcView';
4
+ export * from './specs/Permissions.nitro';
4
5
  export * from './specs/MediaDevices.nitro';
5
6
  export * from './specs/MediaStream.nitro';
6
7
  export * from './specs/MediaStreamTrack.nitro';
@@ -8,4 +9,5 @@ export * from './specs/RTCPeerConnection.nitro';
8
9
  export * from './specs/RTCRtpSender.nitro';
9
10
  export * from './specs/RTCRtpReceiver.nitro';
10
11
  export * from './specs/RTCRtpTransceiver.nitro';
12
+ export * from './specs/MediaRecorder.nitro';
11
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,cAAc,oBAAoB;AAClC,cAAc,4BAA4B;AAC1C,cAAc,2BAA2B;AACzC,cAAc,gCAAgC;AAC9C,cAAc,iCAAiC;AAC/C,cAAc,4BAA4B;AAC1C,cAAc,8BAA8B;AAC5C,cAAc,iCAAiC","ignoreList":[]}
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,cAAc,oBAAoB;AAClC,cAAc,2BAA2B;AACzC,cAAc,4BAA4B;AAC1C,cAAc,2BAA2B;AACzC,cAAc,gCAAgC;AAC9C,cAAc,iCAAiC;AAC/C,cAAc,4BAA4B;AAC1C,cAAc,8BAA8B;AAC5C,cAAc,iCAAiC;AAC/C,cAAc,6BAA6B","ignoreList":[]}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ import { getHybridObjectConstructor } from 'react-native-nitro-modules';
4
+ const MediaRecorderConstructor = getHybridObjectConstructor('MediaRecorder');
5
+ const MediaRecorderExport = new Proxy(MediaRecorderConstructor, {
6
+ construct(target, args) {
7
+ const instance = new target();
8
+ instance.stream = args[0];
9
+ return instance;
10
+ }
11
+ });
12
+ export { MediaRecorderExport as MediaRecorder };
13
+ //# sourceMappingURL=MediaRecorder.nitro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getHybridObjectConstructor","MediaRecorderConstructor","MediaRecorderExport","Proxy","construct","target","args","instance","stream","MediaRecorder"],"sourceRoot":"../../../src","sources":["specs/MediaRecorder.nitro.ts"],"mappings":";;AACA,SAASA,0BAA0B,QAAQ,4BAA4B;AAUvE,MAAMC,wBAAwB,GAC5BD,0BAA0B,CAAgB,eAAe,CAAC;AAE5D,MAAME,mBAAmB,GAAG,IAAIC,KAAK,CAACF,wBAAwB,EAAE;EAC9DG,SAASA,CAACC,MAAM,EAAEC,IAAI,EAAE;IACtB,MAAMC,QAAQ,GAAG,IAAIF,MAAM,CAAC,CAAC;IAC7BE,QAAQ,CAACC,MAAM,GAAGF,IAAI,CAAC,CAAC,CAAgB;IACxC,OAAOC,QAAQ;EACjB;AACF,CAAC,CAAiD;AAGlD,SAASL,mBAAmB,IAAIO,aAAa","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ import { NitroModules } from 'react-native-nitro-modules';
4
+ const PermissionsExport = NitroModules.createHybridObject('Permissions');
5
+ export { PermissionsExport as Permissions };
6
+ //# sourceMappingURL=Permissions.nitro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NitroModules","PermissionsExport","createHybridObject","Permissions"],"sourceRoot":"../../../src","sources":["specs/Permissions.nitro.ts"],"mappings":";;AACA,SAASA,YAAY,QAAQ,4BAA4B;AAiBzD,MAAMC,iBAAiB,GACrBD,YAAY,CAACE,kBAAkB,CAAc,aAAa,CAAC;AAE7D,SAASD,iBAAiB,IAAIE,WAAW","ignoreList":[]}
@@ -1,4 +1,5 @@
1
1
  export * from './views/WebrtcView';
2
+ export * from './specs/Permissions.nitro';
2
3
  export * from './specs/MediaDevices.nitro';
3
4
  export * from './specs/MediaStream.nitro';
4
5
  export * from './specs/MediaStreamTrack.nitro';
@@ -6,4 +7,5 @@ export * from './specs/RTCPeerConnection.nitro';
6
7
  export * from './specs/RTCRtpSender.nitro';
7
8
  export * from './specs/RTCRtpReceiver.nitro';
8
9
  export * from './specs/RTCRtpTransceiver.nitro';
10
+ export * from './specs/MediaRecorder.nitro';
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iCAAiC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,2BAA2B,CAAA;AACzC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,6BAA6B,CAAA"}