react-native-nitro-modules 0.5.0 → 0.7.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/NitroModules.podspec +3 -1
- package/README.md +33 -14
- package/android/gradle.properties +5 -5
- package/android/src/main/cpp/JNIOnLoad.cpp +8 -0
- package/android/src/main/cpp/core/ByteBufferArrayBuffer.hpp +47 -0
- package/android/src/main/cpp/core/JAnyMap.hpp +193 -0
- package/android/src/main/cpp/core/JAnyValue.hpp +191 -0
- package/android/src/main/cpp/core/JArrayBuffer.hpp +124 -0
- package/android/src/main/cpp/core/JHybridObject.hpp +11 -4
- package/android/src/main/cpp/core/JPromise.hpp +88 -0
- package/android/src/main/cpp/platform/NitroLogger.cpp +36 -0
- package/android/src/main/cpp/registry/JHybridObjectInitializer.hpp +1 -1
- package/android/src/main/cpp/registry/JHybridObjectRegistry.cpp +1 -1
- package/android/src/main/cpp/registry/JHybridObjectRegistry.hpp +1 -1
- package/android/src/main/cpp/utils/{JNISharedPtr.h → JNISharedPtr.hpp} +13 -1
- package/android/src/main/java/com/margelo/nitro/JNIOnLoad.java +27 -0
- package/android/src/main/java/com/margelo/nitro/NitroModulesPackage.java +1 -9
- package/android/src/main/java/com/margelo/nitro/core/AnyMap.kt +80 -0
- package/android/src/main/java/com/margelo/nitro/core/AnyValue.kt +164 -0
- package/android/src/main/java/com/margelo/nitro/core/ArrayBuffer.kt +115 -0
- package/android/src/main/java/com/margelo/nitro/{HybridObject.kt → core/HybridObject.kt} +12 -15
- package/android/src/main/java/com/margelo/nitro/{HybridObjectInitializer.java → core/HybridObjectInitializer.java} +1 -1
- package/android/src/main/java/com/margelo/nitro/{HybridObjectRegistry.java → core/HybridObjectRegistry.java} +6 -4
- package/android/src/main/java/com/margelo/nitro/core/Promise.kt +115 -0
- package/cpp/core/AnyMap.hpp +2 -2
- package/cpp/core/ArrayBuffer.cpp +5 -5
- package/cpp/core/ArrayBuffer.hpp +7 -9
- package/cpp/core/HybridFunction.hpp +120 -46
- package/cpp/core/HybridObject.cpp +17 -6
- package/cpp/core/HybridObject.hpp +32 -8
- package/cpp/jsi/JSICache.cpp +5 -5
- package/cpp/jsi/JSICache.hpp +1 -3
- package/cpp/jsi/JSIConverter+AnyMap.hpp +2 -2
- package/cpp/jsi/JSIConverter+ArrayBuffer.hpp +2 -2
- package/cpp/jsi/JSIConverter+Function.hpp +7 -6
- package/cpp/jsi/JSIConverter+HybridObject.hpp +6 -5
- package/cpp/jsi/JSIConverter+Optional.hpp +1 -1
- package/cpp/jsi/JSIConverter+Promise.hpp +5 -4
- package/cpp/jsi/JSIConverter+Tuple.hpp +1 -1
- package/cpp/jsi/JSIConverter+UnorderedMap.hpp +1 -1
- package/cpp/jsi/JSIConverter+Variant.hpp +1 -3
- package/cpp/jsi/JSIConverter+Vector.hpp +1 -1
- package/cpp/jsi/JSIConverter.hpp +11 -11
- package/cpp/jsi/JSPromise.cpp +2 -2
- package/cpp/platform/NitroLogger.hpp +67 -0
- package/cpp/prototype/HybridObjectPrototype.cpp +2 -2
- package/cpp/prototype/Prototype.hpp +43 -22
- package/cpp/registry/HybridObjectRegistry.cpp +4 -4
- package/cpp/threading/Dispatcher.cpp +4 -3
- package/cpp/threading/ThreadPool.cpp +2 -2
- package/cpp/turbomodule/NativeNitroModules.cpp +26 -8
- package/cpp/turbomodule/NativeNitroModules.h +1 -0
- package/cpp/turbomodule/NativeNitroModules.hpp +2 -0
- package/cpp/utils/TypeInfo.hpp +14 -0
- package/ios/core/AnyMapHolder.hpp +91 -0
- package/ios/core/AnyMapHolder.swift +316 -0
- package/ios/core/ArrayBufferHolder.hpp +7 -5
- package/ios/core/ArrayBufferHolder.swift +22 -7
- package/ios/core/HybridContext.hpp +3 -3
- package/ios/core/Promise.swift +20 -0
- package/ios/core/PromiseHolder.hpp +15 -11
- package/ios/platform/NitroLogger.mm +36 -0
- package/ios/platform/ThreadUtils.cpp +1 -1
- package/ios/turbomodule/NitroModuleOnLoad.mm +2 -1
- package/ios/utils/SwiftClosure.hpp +63 -0
- package/ios/utils/SwiftClosure.swift +58 -0
- package/lib/AnyMap.d.ts +3 -0
- package/lib/HybridObject.d.ts +15 -0
- package/lib/NativeNitroModules.d.ts +2 -0
- package/lib/NitroModules.d.ts +18 -0
- package/lib/NitroModules.js +24 -0
- package/lib/commonjs/NativeNitroModules.js.map +1 -1
- package/lib/commonjs/NitroModules.js +24 -0
- package/lib/commonjs/NitroModules.js.map +1 -1
- package/lib/commonjs/package.json +1 -0
- package/lib/module/AnyMap.js +1 -1
- package/lib/module/HybridObject.js +1 -1
- package/lib/module/ModuleNotFoundError.js +2 -0
- package/lib/module/ModuleNotFoundError.js.map +1 -1
- package/lib/module/NativeNitroModules.js +2 -0
- package/lib/module/NativeNitroModules.js.map +1 -1
- package/lib/module/NativeNitroModules.web.js +2 -0
- package/lib/module/NativeNitroModules.web.js.map +1 -1
- package/lib/module/NitroModules.js +26 -0
- package/lib/module/NitroModules.js.map +1 -1
- package/lib/module/index.js +2 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/package.json +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -12
- package/src/AnyMap.ts +3 -0
- package/src/HybridObject.ts +15 -0
- package/src/NativeNitroModules.ts +5 -0
- package/src/NitroModules.ts +24 -0
- package/android/src/main/cpp/core/JHybridObject.cpp +0 -8
- package/cpp/templates/IsInPack.hpp +0 -21
- package/cpp/utils/NitroLogger.hpp +0 -58
- package/ios/utils/ClosureWrapper.swift +0 -45
package/NitroModules.podspec
CHANGED
|
@@ -13,7 +13,7 @@ Pod::Spec.new do |s|
|
|
|
13
13
|
s.authors = package["author"]
|
|
14
14
|
|
|
15
15
|
s.platforms = { :ios => min_ios_version_supported }
|
|
16
|
-
s.source = { :git => "https://github.com/mrousavy/
|
|
16
|
+
s.source = { :git => "https://github.com/mrousavy/nitro.git", :tag => "#{s.version}" }
|
|
17
17
|
|
|
18
18
|
# VisionCamera Core C++ bindings
|
|
19
19
|
s.source_files = [
|
|
@@ -39,7 +39,9 @@ Pod::Spec.new do |s|
|
|
|
39
39
|
# Public iOS-specific headers that will be exposed in modulemap (for Swift)
|
|
40
40
|
"ios/core/ArrayBufferHolder.hpp",
|
|
41
41
|
"ios/core/PromiseHolder.hpp",
|
|
42
|
+
"ios/core/AnyMapHolder.hpp",
|
|
42
43
|
"ios/core/HybridContext.hpp",
|
|
44
|
+
"ios/utils/SwiftClosure.hpp",
|
|
43
45
|
]
|
|
44
46
|
|
|
45
47
|
s.pod_target_xcconfig = {
|
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<a href="https://margelo.io">
|
|
2
2
|
<picture>
|
|
3
|
-
<source media="(prefers-color-scheme: dark)" srcset="../../docs/img/banner-react-native-nitro-modules-dark.png" />
|
|
4
|
-
<source media="(prefers-color-scheme: light)" srcset="../../docs/img/banner-react-native-nitro-modules-light.png" />
|
|
5
|
-
<img alt="Nitrogen" src="../../docs/img/banner-react-native-nitro-modules-light.png" />
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="../../docs/static/img/banner-react-native-nitro-modules-dark.png" />
|
|
4
|
+
<source media="(prefers-color-scheme: light)" srcset="../../docs/static/img/banner-react-native-nitro-modules-light.png" />
|
|
5
|
+
<img alt="Nitrogen" src="../../docs/static/img/banner-react-native-nitro-modules-light.png" />
|
|
6
6
|
</picture>
|
|
7
7
|
</a>
|
|
8
8
|
|
|
@@ -112,97 +112,116 @@ The following C++ / JS types are supported out of the box:
|
|
|
112
112
|
<th>JS Type</th>
|
|
113
113
|
<th>C++ Type</th>
|
|
114
114
|
<th>Swift Type</th>
|
|
115
|
+
<th>Kotlin Type</th>
|
|
115
116
|
</tr>
|
|
116
117
|
|
|
117
118
|
<tr>
|
|
118
119
|
<td><code>number</code></td>
|
|
119
120
|
<td><code>double</code> / <code>int</code> / <code>float</code></td>
|
|
120
|
-
<td><code>Double</code
|
|
121
|
+
<td><code>Double</code></td>
|
|
122
|
+
<td><code>Double</code></td>
|
|
121
123
|
</tr>
|
|
122
124
|
<tr>
|
|
123
125
|
<td><code>boolean</code></td>
|
|
124
126
|
<td><code>bool</code></td>
|
|
125
127
|
<td><code>Bool</code></td>
|
|
128
|
+
<td><code>Boolean</code></td>
|
|
126
129
|
</tr>
|
|
127
130
|
<tr>
|
|
128
131
|
<td><code>string</code></td>
|
|
129
132
|
<td><code>std::string</code></td>
|
|
130
133
|
<td><code>String</code></td>
|
|
134
|
+
<td><code>String</code></td>
|
|
131
135
|
</tr>
|
|
132
136
|
<tr>
|
|
133
137
|
<td><code>bigint</code></td>
|
|
134
138
|
<td><code>int64_t</code> / <code>uint64_t</code></td>
|
|
135
|
-
<td><code>Int64</code
|
|
139
|
+
<td><code>Int64</code></td>
|
|
140
|
+
<td><code>Long</code></td>
|
|
136
141
|
</tr>
|
|
137
142
|
<tr>
|
|
138
143
|
<td><code>T[]</code></td>
|
|
139
144
|
<td><code>std::vector<T></code></td>
|
|
140
145
|
<td><code>[T]</code></td>
|
|
146
|
+
<td><code>Array<T></code> / <code>PrimitiveArray</code></td>
|
|
141
147
|
</tr>
|
|
142
148
|
<tr>
|
|
143
149
|
<td><code>[A, B, C, ...]</code></td>
|
|
144
150
|
<td><code>std::tuple<A, B, C, ...></code></td>
|
|
145
|
-
<td><code>(A, B, C)</code
|
|
151
|
+
<td><code>(A, B, C)</code> 🟡 (<a href="https://github.com/mrousavy/nitro/issues/38">#38</a>)</td>
|
|
152
|
+
<td>❌</td>
|
|
146
153
|
</tr>
|
|
147
154
|
<tr>
|
|
148
155
|
<td><code>A | B | C | ...</code></td>
|
|
149
156
|
<td><code>std::variant<A, B, C, ...></code></td>
|
|
150
|
-
<td><code>Variant_A_B_C</code
|
|
157
|
+
<td><code>Variant_A_B_C</code> 🟡 (<a href="https://github.com/mrousavy/nitro/issues/39">#39</a>)</td>
|
|
158
|
+
<td>❌</td>
|
|
151
159
|
</tr>
|
|
152
160
|
<tr>
|
|
153
161
|
<td><code>Record<string, T></code></td>
|
|
154
162
|
<td><code>std::unordered_map<std::string, T></code></td>
|
|
155
163
|
<td><code>Dictionary<String, T></code></td>
|
|
164
|
+
<td><code>Map<std::string, T></code></td>
|
|
156
165
|
</tr>
|
|
157
166
|
<tr>
|
|
158
167
|
<td><code>T?</code></td>
|
|
159
168
|
<td><code>std::optional<T></code></td>
|
|
160
169
|
<td><code>T?</code></td>
|
|
170
|
+
<td><code>T?</code></td>
|
|
161
171
|
</tr>
|
|
162
172
|
<tr>
|
|
163
173
|
<td><code>Promise<T></code></td>
|
|
164
174
|
<td><code>std::future<T></code></td>
|
|
165
175
|
<td><code><a href="./ios/core/Promise.swift">Promise<T></a></code></td>
|
|
176
|
+
<td><code><a href="./android/src/main/java/com/margelo/nitro/core/Promise.kt">Promise<T></a></code></td>
|
|
166
177
|
</tr>
|
|
167
178
|
<tr>
|
|
168
|
-
<td><code>(
|
|
169
|
-
<td><code>std::function<void (
|
|
170
|
-
<td><code>@escaping (
|
|
179
|
+
<td><code>(T...) => void</code></td>
|
|
180
|
+
<td><code>std::function<void (T...)></code></td>
|
|
181
|
+
<td><code>@escaping (T...) -> Void</code></td>
|
|
182
|
+
<td><code>(T...) -> Unit</code></td>
|
|
171
183
|
</tr>
|
|
172
184
|
<tr>
|
|
173
|
-
<td><code>(
|
|
174
|
-
<td><code>std::function<std::future<
|
|
185
|
+
<td><code>(T...) => R</code></td>
|
|
186
|
+
<td><code>std::function<std::future<R> (T...)></code></td>
|
|
187
|
+
<td>❌</td>
|
|
175
188
|
<td>❌</td>
|
|
176
189
|
</tr>
|
|
177
190
|
<tr>
|
|
178
191
|
<td><code>{ ... }</code></td>
|
|
179
192
|
<td><code>std::shared_ptr<<a href="./cpp/core/AnyMap.hpp">AnyMap</a>></code></td>
|
|
180
|
-
<td
|
|
193
|
+
<td><code><a href="./ios/core/AnyMapHolder.swift">AnyMapHolder</a></code> 🟡 (<a href="https://github.com/mrousavy/nitro/issues/57">#57</a>)</td>
|
|
194
|
+
<td><code><a href="./android/src/main/java/com/margelo/nitro/core/AnyMap.kt">AnyMap</a></code></td>
|
|
181
195
|
</tr>
|
|
182
196
|
<tr>
|
|
183
197
|
<td><code>ArrayBuffer</code></td>
|
|
184
198
|
<td><code>std::shared_ptr<<a href="./cpp/core/ArrayBuffer.hpp">ArrayBuffer</a>></code></td>
|
|
185
|
-
<td><code><a href="./ios/core/ArrayBufferHolder.
|
|
199
|
+
<td><code><a href="./ios/core/ArrayBufferHolder.swift">ArrayBufferHolder</a></code></td>
|
|
200
|
+
<td><code><a href="./android/src/main/java/com/margelo/nitro/core/ArrayBuffer.kt">ArrayBuffer</a></code></td>
|
|
186
201
|
</tr>
|
|
187
202
|
<tr>
|
|
188
203
|
<td>..any <code><a href="./src/HybridObject.ts">HybridObject</a></code></td>
|
|
189
204
|
<td><code>std::shared_ptr<<a href="./cpp/core/HybridObject.hpp">HybridObject</a>></code></td>
|
|
190
205
|
<td><code><a href="./ios/core/HybridObjectSpec.swift">HybridObjectSpec</a></code></td>
|
|
206
|
+
<td><code><a href="./android/core/HybridObject.kt">HybridObject</a></code></td>
|
|
191
207
|
</tr>
|
|
192
208
|
<tr>
|
|
193
209
|
<td>..any <code>interface</code></td>
|
|
194
210
|
<td><code>T</code></td>
|
|
195
211
|
<td><code>T</code></td>
|
|
212
|
+
<td><code>T</code></td>
|
|
196
213
|
</tr>
|
|
197
214
|
<tr>
|
|
198
215
|
<td>..any <code>enum</code></td>
|
|
199
216
|
<td><code>T</code></td>
|
|
200
217
|
<td><code>T</code></td>
|
|
218
|
+
<td><code>T</code></td>
|
|
201
219
|
</tr>
|
|
202
220
|
<tr>
|
|
203
221
|
<td>..any <code>union</code></td>
|
|
204
222
|
<td><code>T</code></td>
|
|
205
223
|
<td><code>T</code></td>
|
|
224
|
+
<td><code>T</code></td>
|
|
206
225
|
</tr>
|
|
207
226
|
</table>
|
|
208
227
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
Nitro_kotlinVersion=1.
|
|
2
|
-
Nitro_minSdkVersion=
|
|
3
|
-
Nitro_targetSdkVersion=
|
|
4
|
-
Nitro_compileSdkVersion=
|
|
5
|
-
Nitro_ndkVersion=
|
|
1
|
+
Nitro_kotlinVersion=1.9.24
|
|
2
|
+
Nitro_minSdkVersion=23
|
|
3
|
+
Nitro_targetSdkVersion=34
|
|
4
|
+
Nitro_compileSdkVersion=34
|
|
5
|
+
Nitro_ndkVersion=26.1.10909125
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/// Entry point for JNI.
|
|
2
2
|
|
|
3
|
+
#include "JAnyMap.hpp"
|
|
4
|
+
#include "JAnyValue.hpp"
|
|
5
|
+
#include "JArrayBuffer.hpp"
|
|
3
6
|
#include "JHybridObjectRegistry.hpp"
|
|
7
|
+
#include "JPromise.hpp"
|
|
4
8
|
#include "RegisterNativeNitroModules.hpp"
|
|
5
9
|
#include <fbjni/fbjni.h>
|
|
6
10
|
#include <jni.h>
|
|
@@ -14,5 +18,9 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
|
|
|
14
18
|
|
|
15
19
|
// 2. Initialize all Java bindings
|
|
16
20
|
JHybridObjectRegistry::registerNatives();
|
|
21
|
+
JArrayBuffer::registerNatives();
|
|
22
|
+
JAnyMap::registerNatives();
|
|
23
|
+
JAnyValue::registerNatives();
|
|
24
|
+
JPromise::registerNatives();
|
|
17
25
|
});
|
|
18
26
|
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ByteBufferArrayBuffer.hpp
|
|
3
|
+
// react-native-nitro
|
|
4
|
+
//
|
|
5
|
+
// Created by Marc Rousavy on 14.07.24.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include "ArrayBuffer.hpp"
|
|
11
|
+
#include <fbjni/ByteBuffer.h>
|
|
12
|
+
#include <fbjni/fbjni.h>
|
|
13
|
+
|
|
14
|
+
namespace margelo::nitro {
|
|
15
|
+
|
|
16
|
+
using namespace facebook;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Represents an `ArrayBuffer` that holds a `ByteBuffer`.
|
|
20
|
+
*/
|
|
21
|
+
class ByteBufferArrayBuffer final : public ArrayBuffer {
|
|
22
|
+
public:
|
|
23
|
+
explicit ByteBufferArrayBuffer(const jni::alias_ref<jni::JByteBuffer>& byteBuffer) : _byteBuffer(jni::make_global(byteBuffer)) {
|
|
24
|
+
_byteBuffer->order(jni::JByteOrder::bigEndian());
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public:
|
|
28
|
+
[[nodiscard]] uint8_t* data() override {
|
|
29
|
+
return _byteBuffer->getDirectBytes();
|
|
30
|
+
}
|
|
31
|
+
[[nodiscard]] size_t size() const override {
|
|
32
|
+
return _byteBuffer->getDirectSize();
|
|
33
|
+
}
|
|
34
|
+
[[nodiscard]] bool isOwner() const noexcept override {
|
|
35
|
+
return _byteBuffer != nullptr && _byteBuffer->isDirect();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public:
|
|
39
|
+
[[nodiscard]] jni::alias_ref<jni::JByteBuffer> getBuffer() const {
|
|
40
|
+
return _byteBuffer;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private:
|
|
44
|
+
jni::global_ref<jni::JByteBuffer> _byteBuffer;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
} // namespace margelo::nitro
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
//
|
|
2
|
+
// JAnyMap.hpp
|
|
3
|
+
// react-native-nitro
|
|
4
|
+
//
|
|
5
|
+
// Created by Marc Rousavy on 14.07.24.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include "AnyMap.hpp"
|
|
11
|
+
#include "JAnyValue.hpp"
|
|
12
|
+
#include <fbjni/fbjni.h>
|
|
13
|
+
|
|
14
|
+
namespace margelo::nitro {
|
|
15
|
+
|
|
16
|
+
using namespace facebook;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Represents an `AnyMap` implemented in Java.
|
|
20
|
+
*/
|
|
21
|
+
class JAnyMap final : public jni::HybridClass<JAnyMap> {
|
|
22
|
+
public:
|
|
23
|
+
static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/core/AnyMap;";
|
|
24
|
+
|
|
25
|
+
public:
|
|
26
|
+
/**
|
|
27
|
+
* Create a new, empty `AnyMap` from Java.
|
|
28
|
+
*/
|
|
29
|
+
static jni::local_ref<JAnyMap::jhybriddata> initHybrid(jni::alias_ref<jhybridobject>) {
|
|
30
|
+
return makeCxxInstance();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a new `JAnyMap` from an existing `AnyMap`.
|
|
34
|
+
*/
|
|
35
|
+
static jni::local_ref<JAnyMap::javaobject> create(const std::shared_ptr<AnyMap>& map) {
|
|
36
|
+
return newObjectCxxArgs(map);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private:
|
|
40
|
+
JAnyMap() {
|
|
41
|
+
_map = std::make_shared<AnyMap>();
|
|
42
|
+
}
|
|
43
|
+
JAnyMap(const std::shared_ptr<AnyMap>& map) : _map(map) {}
|
|
44
|
+
|
|
45
|
+
protected:
|
|
46
|
+
bool contains(const std::string& key) {
|
|
47
|
+
return _map->contains(key);
|
|
48
|
+
}
|
|
49
|
+
void remove(const std::string& key) {
|
|
50
|
+
_map->remove(key);
|
|
51
|
+
}
|
|
52
|
+
void clear() {
|
|
53
|
+
_map->clear();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
protected:
|
|
57
|
+
bool isNull(const std::string& key) {
|
|
58
|
+
return _map->isNull(key);
|
|
59
|
+
}
|
|
60
|
+
bool isDouble(const std::string& key) {
|
|
61
|
+
return _map->isDouble(key);
|
|
62
|
+
}
|
|
63
|
+
bool isBoolean(const std::string& key) {
|
|
64
|
+
return _map->isBoolean(key);
|
|
65
|
+
}
|
|
66
|
+
bool isBigInt(const std::string& key) {
|
|
67
|
+
return _map->isBigInt(key);
|
|
68
|
+
}
|
|
69
|
+
bool isString(const std::string& key) {
|
|
70
|
+
return _map->isString(key);
|
|
71
|
+
}
|
|
72
|
+
bool isArray(const std::string& key) {
|
|
73
|
+
return _map->isArray(key);
|
|
74
|
+
}
|
|
75
|
+
bool isObject(const std::string& key) {
|
|
76
|
+
return _map->isObject(key);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
protected:
|
|
80
|
+
double getDouble(const std::string& key) {
|
|
81
|
+
return _map->getDouble(key);
|
|
82
|
+
}
|
|
83
|
+
bool getBoolean(const std::string& key) {
|
|
84
|
+
return _map->getBoolean(key);
|
|
85
|
+
}
|
|
86
|
+
int64_t getBigInt(const std::string& key) {
|
|
87
|
+
return _map->getBigInt(key);
|
|
88
|
+
}
|
|
89
|
+
std::string getString(const std::string& key) {
|
|
90
|
+
return _map->getString(key);
|
|
91
|
+
}
|
|
92
|
+
jni::alias_ref<JAnyArray> getAnyArray(const std::string& key) {
|
|
93
|
+
const auto& vector = _map->getArray(key);
|
|
94
|
+
auto javaArray = jni::JArrayClass<JAnyValue::javaobject>::newArray(vector.size());
|
|
95
|
+
for (size_t i = 0; i < vector.size(); i++) {
|
|
96
|
+
auto value = JAnyValue::create(vector[i]);
|
|
97
|
+
javaArray->setElement(i, value.get());
|
|
98
|
+
}
|
|
99
|
+
return javaArray;
|
|
100
|
+
}
|
|
101
|
+
jni::alias_ref<JAnyObject> getAnyObject(const std::string& key) {
|
|
102
|
+
const auto& map = _map->getObject(key);
|
|
103
|
+
auto javaMap = jni::JHashMap<jni::JString, JAnyValue::javaobject>::create(map.size());
|
|
104
|
+
for (const auto& entry : map) {
|
|
105
|
+
auto string = jni::make_jstring(entry.first);
|
|
106
|
+
auto value = JAnyValue::create(entry.second);
|
|
107
|
+
javaMap->put(string, value);
|
|
108
|
+
}
|
|
109
|
+
return javaMap;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
protected:
|
|
113
|
+
void setNull(const std::string& key) {
|
|
114
|
+
_map->setNull(key);
|
|
115
|
+
}
|
|
116
|
+
void setDouble(const std::string& key, double value) {
|
|
117
|
+
_map->setDouble(key, value);
|
|
118
|
+
}
|
|
119
|
+
void setBoolean(const std::string& key, bool value) {
|
|
120
|
+
_map->setBoolean(key, value);
|
|
121
|
+
}
|
|
122
|
+
void setBigInt(const std::string& key, int64_t value) {
|
|
123
|
+
_map->setBigInt(key, value);
|
|
124
|
+
}
|
|
125
|
+
void setString(const std::string& key, const std::string& value) {
|
|
126
|
+
_map->setString(key, value);
|
|
127
|
+
}
|
|
128
|
+
void setAnyArray(const std::string& key, jni::alias_ref<JAnyArray> value) {
|
|
129
|
+
std::vector<AnyValue> vector;
|
|
130
|
+
size_t size = value->size();
|
|
131
|
+
vector.reserve(size);
|
|
132
|
+
for (size_t i = 0; i < size; i++) {
|
|
133
|
+
auto anyValue = value->getElement(i);
|
|
134
|
+
vector.push_back(anyValue->cthis()->getValue());
|
|
135
|
+
}
|
|
136
|
+
_map->setArray(key, vector);
|
|
137
|
+
}
|
|
138
|
+
void setAnyObject(const std::string& key, const jni::alias_ref<JAnyObject>& value) {
|
|
139
|
+
std::unordered_map<std::string, AnyValue> map;
|
|
140
|
+
map.reserve(value->size());
|
|
141
|
+
for (const auto& entry : *value) {
|
|
142
|
+
map.emplace(entry.first->toStdString(), entry.second->cthis()->getValue());
|
|
143
|
+
}
|
|
144
|
+
_map->setObject(key, map);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
public:
|
|
148
|
+
std::shared_ptr<AnyMap> getMap() const {
|
|
149
|
+
return _map;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
private:
|
|
153
|
+
friend HybridBase;
|
|
154
|
+
using HybridBase::HybridBase;
|
|
155
|
+
std::shared_ptr<AnyMap> _map;
|
|
156
|
+
|
|
157
|
+
public:
|
|
158
|
+
static void registerNatives() {
|
|
159
|
+
registerHybrid({
|
|
160
|
+
// init
|
|
161
|
+
makeNativeMethod("initHybrid", JAnyMap::initHybrid),
|
|
162
|
+
// helpers
|
|
163
|
+
makeNativeMethod("contains", JAnyMap::contains),
|
|
164
|
+
makeNativeMethod("remove", JAnyMap::remove),
|
|
165
|
+
makeNativeMethod("clear", JAnyMap::clear),
|
|
166
|
+
// is
|
|
167
|
+
makeNativeMethod("isNull", JAnyMap::isNull),
|
|
168
|
+
makeNativeMethod("isDouble", JAnyMap::isDouble),
|
|
169
|
+
makeNativeMethod("isBoolean", JAnyMap::isBoolean),
|
|
170
|
+
makeNativeMethod("isBigInt", JAnyMap::isBigInt),
|
|
171
|
+
makeNativeMethod("isString", JAnyMap::isString),
|
|
172
|
+
makeNativeMethod("isArray", JAnyMap::isArray),
|
|
173
|
+
makeNativeMethod("isObject", JAnyMap::isObject),
|
|
174
|
+
// get
|
|
175
|
+
makeNativeMethod("getDouble", JAnyMap::getDouble),
|
|
176
|
+
makeNativeMethod("getBoolean", JAnyMap::getBoolean),
|
|
177
|
+
makeNativeMethod("getBigInt", JAnyMap::getBigInt),
|
|
178
|
+
makeNativeMethod("getString", JAnyMap::getString),
|
|
179
|
+
makeNativeMethod("getAnyArray", JAnyMap::getAnyArray),
|
|
180
|
+
makeNativeMethod("getAnyObject", JAnyMap::getAnyObject),
|
|
181
|
+
// set
|
|
182
|
+
makeNativeMethod("setNull", JAnyMap::setNull),
|
|
183
|
+
makeNativeMethod("setDouble", JAnyMap::setDouble),
|
|
184
|
+
makeNativeMethod("setBoolean", JAnyMap::setBoolean),
|
|
185
|
+
makeNativeMethod("setBigInt", JAnyMap::setBigInt),
|
|
186
|
+
makeNativeMethod("setString", JAnyMap::setString),
|
|
187
|
+
makeNativeMethod("setAnyArray", JAnyMap::setAnyArray),
|
|
188
|
+
makeNativeMethod("setAnyObject", JAnyMap::setAnyObject),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
} // namespace margelo::nitro
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
//
|
|
2
|
+
// JAnyMap.hpp
|
|
3
|
+
// react-native-nitro
|
|
4
|
+
//
|
|
5
|
+
// Created by Marc Rousavy on 14.07.24.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include "AnyMap.hpp"
|
|
11
|
+
#include <fbjni/fbjni.h>
|
|
12
|
+
|
|
13
|
+
namespace margelo::nitro {
|
|
14
|
+
|
|
15
|
+
using namespace facebook;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Represents an `AnyValue` (variant) implemented in Java.
|
|
19
|
+
*/
|
|
20
|
+
class JAnyValue final : public jni::HybridClass<JAnyValue> {
|
|
21
|
+
public:
|
|
22
|
+
static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/core/AnyValue;";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Represents an `Array<AnyValue>`
|
|
26
|
+
*/
|
|
27
|
+
using JAnyArray = jni::JArrayClass<JAnyValue::javaobject>;
|
|
28
|
+
/**
|
|
29
|
+
* Represents a `Map<String, AnyValue>`
|
|
30
|
+
*/
|
|
31
|
+
using JAnyObject = jni::JMap<jni::JString, JAnyValue::javaobject>;
|
|
32
|
+
|
|
33
|
+
public:
|
|
34
|
+
/**
|
|
35
|
+
* Create a new `JAnyValue` from an existing `AnyValue`.
|
|
36
|
+
*/
|
|
37
|
+
static jni::local_ref<JAnyValue::javaobject> create(AnyValue&& value) {
|
|
38
|
+
return newObjectCxxArgs(std::move(value));
|
|
39
|
+
}
|
|
40
|
+
static jni::local_ref<JAnyValue::javaobject> create(const AnyValue& value) {
|
|
41
|
+
return newObjectCxxArgs(value);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
protected:
|
|
45
|
+
static jni::local_ref<JAnyValue::jhybriddata> initHybridNull(jni::alias_ref<jhybridobject>) {
|
|
46
|
+
return makeCxxInstance(/* null */);
|
|
47
|
+
}
|
|
48
|
+
static jni::local_ref<JAnyValue::jhybriddata> initHybridDouble(jni::alias_ref<jhybridobject>, double value) {
|
|
49
|
+
return makeCxxInstance(value);
|
|
50
|
+
}
|
|
51
|
+
static jni::local_ref<JAnyValue::jhybriddata> initHybridBoolean(jni::alias_ref<jhybridobject>, bool value) {
|
|
52
|
+
return makeCxxInstance(value);
|
|
53
|
+
}
|
|
54
|
+
static jni::local_ref<JAnyValue::jhybriddata> initHybridLong(jni::alias_ref<jhybridobject>, int64_t value) {
|
|
55
|
+
return makeCxxInstance(value);
|
|
56
|
+
}
|
|
57
|
+
static jni::local_ref<JAnyValue::jhybriddata> initHybridString(jni::alias_ref<jhybridobject>, const std::string& value) {
|
|
58
|
+
return makeCxxInstance(value);
|
|
59
|
+
}
|
|
60
|
+
static jni::local_ref<JAnyValue::jhybriddata> initHybridAnyArray(jni::alias_ref<jhybridobject>, jni::alias_ref<JAnyArray> value) {
|
|
61
|
+
std::vector<AnyValue> vector;
|
|
62
|
+
size_t size = value->size();
|
|
63
|
+
vector.reserve(size);
|
|
64
|
+
for (size_t i = 0; i < size; i++) {
|
|
65
|
+
auto anyValue = value->getElement(i);
|
|
66
|
+
vector.push_back(anyValue->cthis()->getValue());
|
|
67
|
+
}
|
|
68
|
+
return makeCxxInstance(std::move(vector));
|
|
69
|
+
}
|
|
70
|
+
static jni::local_ref<JAnyValue::jhybriddata> initHybridAnyObject(jni::alias_ref<jhybridobject>, jni::alias_ref<JAnyObject> value) {
|
|
71
|
+
std::unordered_map<std::string, AnyValue> map;
|
|
72
|
+
map.reserve(value->size());
|
|
73
|
+
for (const auto& entry : *value) {
|
|
74
|
+
map.emplace(entry.first->toStdString(), entry.second->cthis()->getValue());
|
|
75
|
+
}
|
|
76
|
+
return makeCxxInstance(std::move(map));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private:
|
|
80
|
+
// Java initializers
|
|
81
|
+
explicit JAnyValue(/* null */) : _value(std::monostate()) {}
|
|
82
|
+
explicit JAnyValue(double value) : _value(value) {}
|
|
83
|
+
explicit JAnyValue(bool value) : _value(value) {}
|
|
84
|
+
explicit JAnyValue(int64_t value) : _value(value) {}
|
|
85
|
+
explicit JAnyValue(const std::string& value) : _value(value) {}
|
|
86
|
+
explicit JAnyValue(AnyArray&& value) : _value(std::move(value)) {}
|
|
87
|
+
explicit JAnyValue(AnyObject&& value) : _value(std::move(value)) {}
|
|
88
|
+
// C++ initializers
|
|
89
|
+
explicit JAnyValue(const AnyValue& value) : _value(value) {}
|
|
90
|
+
explicit JAnyValue(AnyValue&& value) : _value(std::move(value)) {}
|
|
91
|
+
|
|
92
|
+
protected:
|
|
93
|
+
bool isNull() {
|
|
94
|
+
return std::holds_alternative<std::monostate>(_value);
|
|
95
|
+
}
|
|
96
|
+
bool isDouble() {
|
|
97
|
+
return std::holds_alternative<double>(_value);
|
|
98
|
+
}
|
|
99
|
+
bool isBoolean() {
|
|
100
|
+
return std::holds_alternative<bool>(_value);
|
|
101
|
+
}
|
|
102
|
+
bool isBigInt() {
|
|
103
|
+
return std::holds_alternative<int64_t>(_value);
|
|
104
|
+
}
|
|
105
|
+
bool isString() {
|
|
106
|
+
return std::holds_alternative<std::string>(_value);
|
|
107
|
+
}
|
|
108
|
+
bool isAnyArray() {
|
|
109
|
+
return std::holds_alternative<AnyArray>(_value);
|
|
110
|
+
}
|
|
111
|
+
bool isAnyObject() {
|
|
112
|
+
return std::holds_alternative<AnyObject>(_value);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
protected:
|
|
116
|
+
double asDouble() {
|
|
117
|
+
return std::get<double>(_value);
|
|
118
|
+
}
|
|
119
|
+
bool asBoolean() {
|
|
120
|
+
return std::get<bool>(_value);
|
|
121
|
+
}
|
|
122
|
+
int64_t asBigInt() {
|
|
123
|
+
return std::get<int64_t>(_value);
|
|
124
|
+
}
|
|
125
|
+
std::string asString() {
|
|
126
|
+
return std::get<std::string>(_value);
|
|
127
|
+
}
|
|
128
|
+
jni::alias_ref<JAnyArray> asAnyArray() {
|
|
129
|
+
auto vector = std::get<AnyArray>(_value);
|
|
130
|
+
auto javaArray = jni::JArrayClass<JAnyValue::javaobject>::newArray(vector.size());
|
|
131
|
+
for (size_t i = 0; i < vector.size(); i++) {
|
|
132
|
+
auto value = JAnyValue::create(vector[i]);
|
|
133
|
+
javaArray->setElement(i, value.get());
|
|
134
|
+
}
|
|
135
|
+
return javaArray;
|
|
136
|
+
}
|
|
137
|
+
jni::alias_ref<JAnyObject> asAnyObject() {
|
|
138
|
+
auto map = std::get<AnyObject>(_value);
|
|
139
|
+
auto javaMap = jni::JHashMap<jni::JString, JAnyValue::javaobject>::create(map.size());
|
|
140
|
+
for (const auto& entry : map) {
|
|
141
|
+
auto key = jni::make_jstring(entry.first);
|
|
142
|
+
auto value = JAnyValue::create(entry.second);
|
|
143
|
+
javaMap->put(key, value);
|
|
144
|
+
}
|
|
145
|
+
return javaMap;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
public:
|
|
149
|
+
[[nodiscard]] const AnyValue& getValue() const noexcept {
|
|
150
|
+
return _value;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private:
|
|
154
|
+
friend HybridBase;
|
|
155
|
+
using HybridBase::HybridBase;
|
|
156
|
+
AnyValue _value;
|
|
157
|
+
|
|
158
|
+
public:
|
|
159
|
+
static void registerNatives() {
|
|
160
|
+
registerHybrid({
|
|
161
|
+
// init
|
|
162
|
+
makeNativeMethod("initHybrid", JAnyValue::initHybridNull),
|
|
163
|
+
makeNativeMethod("initHybrid", JAnyValue::initHybridDouble),
|
|
164
|
+
makeNativeMethod("initHybrid", JAnyValue::initHybridBoolean),
|
|
165
|
+
makeNativeMethod("initHybrid", JAnyValue::initHybridLong),
|
|
166
|
+
makeNativeMethod("initHybrid", JAnyValue::initHybridString),
|
|
167
|
+
makeNativeMethod("initHybrid", JAnyValue::initHybridAnyArray),
|
|
168
|
+
makeNativeMethod("initHybrid", JAnyValue::initHybridAnyObject),
|
|
169
|
+
// is
|
|
170
|
+
makeNativeMethod("isNull", JAnyValue::isNull),
|
|
171
|
+
makeNativeMethod("isDouble", JAnyValue::isDouble),
|
|
172
|
+
makeNativeMethod("isBoolean", JAnyValue::isBoolean),
|
|
173
|
+
makeNativeMethod("isBigInt", JAnyValue::isBigInt),
|
|
174
|
+
makeNativeMethod("isString", JAnyValue::isString),
|
|
175
|
+
makeNativeMethod("isAnyArray", JAnyValue::isAnyArray),
|
|
176
|
+
makeNativeMethod("isAnyObject", JAnyValue::isAnyObject),
|
|
177
|
+
// get
|
|
178
|
+
makeNativeMethod("asDouble", JAnyValue::asDouble),
|
|
179
|
+
makeNativeMethod("asBoolean", JAnyValue::asBoolean),
|
|
180
|
+
makeNativeMethod("asBigInt", JAnyValue::asBigInt),
|
|
181
|
+
makeNativeMethod("asString", JAnyValue::asString),
|
|
182
|
+
makeNativeMethod("asAnyArray", JAnyValue::asAnyArray),
|
|
183
|
+
makeNativeMethod("asAnyObject", JAnyValue::asAnyObject),
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
using JAnyArray = JAnyValue::JAnyArray;
|
|
189
|
+
using JAnyObject = JAnyValue::JAnyObject;
|
|
190
|
+
|
|
191
|
+
} // namespace margelo::nitro
|