react-native-nitro-buffer 0.0.14 → 0.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.
- package/android/CMakeLists.txt +8 -0
- package/android/build.gradle +1 -1
- package/cpp/HybridNitroBuffer.cpp +69 -7
- package/nitrogen/generated/android/NitroBuffer+autolinking.cmake +1 -1
- package/nitrogen/generated/android/NitroBuffer+autolinking.gradle +1 -1
- package/nitrogen/generated/android/NitroBufferOnLoad.cpp +23 -18
- package/nitrogen/generated/android/NitroBufferOnLoad.hpp +14 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/buffer/NitroBufferOnLoad.kt +1 -1
- package/nitrogen/generated/ios/NitroBuffer+autolinking.rb +1 -1
- package/nitrogen/generated/ios/NitroBuffer-Swift-Cxx-Bridge.cpp +1 -1
- package/nitrogen/generated/ios/NitroBuffer-Swift-Cxx-Bridge.hpp +1 -1
- package/nitrogen/generated/ios/NitroBuffer-Swift-Cxx-Umbrella.hpp +1 -1
- package/nitrogen/generated/ios/NitroBufferAutolinking.mm +1 -1
- package/nitrogen/generated/ios/NitroBufferAutolinking.swift +5 -1
- package/nitrogen/generated/shared/c++/HybridNitroBufferSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridNitroBufferSpec.hpp +1 -1
- package/package.json +4 -4
package/android/CMakeLists.txt
CHANGED
|
@@ -9,6 +9,9 @@ add_library(NitroBuffer SHARED
|
|
|
9
9
|
../cpp/HybridNitroBuffer.cpp
|
|
10
10
|
)
|
|
11
11
|
|
|
12
|
+
# Force both hash styles (sysv and gnu) for Android loader compatibility
|
|
13
|
+
target_link_options(NitroBuffer PRIVATE "-Wl,--hash-style=both")
|
|
14
|
+
|
|
12
15
|
# Include paths for our headers
|
|
13
16
|
include_directories(
|
|
14
17
|
${CMAKE_CURRENT_SOURCE_DIR}/../cpp
|
|
@@ -23,3 +26,8 @@ target_link_libraries(
|
|
|
23
26
|
NitroBuffer
|
|
24
27
|
${LOG_LIB}
|
|
25
28
|
)
|
|
29
|
+
|
|
30
|
+
# Android 15 16KB page size alignment
|
|
31
|
+
if(ANDROID_ABI STREQUAL "arm64-v8a" OR ANDROID_ABI STREQUAL "x86_64")
|
|
32
|
+
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384")
|
|
33
|
+
endif()
|
package/android/build.gradle
CHANGED
|
@@ -22,7 +22,7 @@ android {
|
|
|
22
22
|
externalNativeBuild {
|
|
23
23
|
cmake {
|
|
24
24
|
cppFlags "-fexceptions -frtti -std=c++20"
|
|
25
|
-
arguments "-DANDROID_STL=c++_shared"
|
|
25
|
+
arguments "-DANDROID_STL=c++_shared", "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
|
|
26
26
|
abiFilters (*reactNativeArchitectures())
|
|
27
27
|
}
|
|
28
28
|
}
|
|
@@ -158,7 +158,7 @@ std::shared_ptr<ArrayBuffer> HybridNitroBuffer::allocUnsafe(double size) {
|
|
|
158
158
|
double HybridNitroBuffer::byteLength(const std::string &string,
|
|
159
159
|
const std::string &encoding) {
|
|
160
160
|
if (encoding == "hex") {
|
|
161
|
-
return string.length() / 2;
|
|
161
|
+
return (double)(string.length() / 2);
|
|
162
162
|
} else if (encoding == "base64") {
|
|
163
163
|
size_t len = string.length();
|
|
164
164
|
if (len == 0)
|
|
@@ -168,10 +168,33 @@ double HybridNitroBuffer::byteLength(const std::string &string,
|
|
|
168
168
|
padding++;
|
|
169
169
|
if (len > 1 && string[len - 2] == '=')
|
|
170
170
|
padding++;
|
|
171
|
-
return (len * 3) / 4 - padding;
|
|
171
|
+
return (double)((len * 3) / 4 - padding);
|
|
172
|
+
} else if (encoding == "binary" || encoding == "latin1") {
|
|
173
|
+
// Each character in the original string (0-255) maps to one byte.
|
|
174
|
+
// The input 'string' is UTF-8 encoded. We count Unicode code points.
|
|
175
|
+
size_t count = 0;
|
|
176
|
+
size_t i = 0;
|
|
177
|
+
size_t len = string.length();
|
|
178
|
+
const char *str = string.c_str();
|
|
179
|
+
while (i < len) {
|
|
180
|
+
unsigned char byte = static_cast<unsigned char>(str[i]);
|
|
181
|
+
if (byte <= 0x7F) {
|
|
182
|
+
i += 1;
|
|
183
|
+
} else if ((byte & 0xE0) == 0xC0) {
|
|
184
|
+
i += 2;
|
|
185
|
+
} else if ((byte & 0xF0) == 0xE0) {
|
|
186
|
+
i += 3;
|
|
187
|
+
} else if ((byte & 0xF8) == 0xF0) {
|
|
188
|
+
i += 4;
|
|
189
|
+
} else {
|
|
190
|
+
i += 1;
|
|
191
|
+
}
|
|
192
|
+
count++;
|
|
193
|
+
}
|
|
194
|
+
return (double)count;
|
|
172
195
|
}
|
|
173
196
|
// utf8 (default)
|
|
174
|
-
return string.length();
|
|
197
|
+
return (double)string.length();
|
|
175
198
|
}
|
|
176
199
|
|
|
177
200
|
double HybridNitroBuffer::write(const std::shared_ptr<ArrayBuffer> &buffer,
|
|
@@ -191,7 +214,7 @@ double HybridNitroBuffer::write(const std::shared_ptr<ArrayBuffer> &buffer,
|
|
|
191
214
|
size_t strLen = string.length();
|
|
192
215
|
size_t actualWrite = std::min(toWrite, strLen);
|
|
193
216
|
memcpy(data + start, string.c_str(), actualWrite);
|
|
194
|
-
return actualWrite;
|
|
217
|
+
return (double)actualWrite;
|
|
195
218
|
} else if (encoding == "hex") {
|
|
196
219
|
size_t strLen = string.length();
|
|
197
220
|
size_t bytesCount = strLen / 2;
|
|
@@ -202,19 +225,58 @@ double HybridNitroBuffer::write(const std::shared_ptr<ArrayBuffer> &buffer,
|
|
|
202
225
|
(unsigned char)strtol(byteString.c_str(), nullptr, 16);
|
|
203
226
|
data[start + i] = byte;
|
|
204
227
|
}
|
|
205
|
-
return actualWrite;
|
|
228
|
+
return (double)actualWrite;
|
|
206
229
|
} else if (encoding == "base64") {
|
|
207
230
|
std::vector<unsigned char> decoded = base64_decode(string);
|
|
208
231
|
size_t actualWrite = std::min(toWrite, decoded.size());
|
|
209
232
|
memcpy(data + start, decoded.data(), actualWrite);
|
|
210
|
-
return actualWrite;
|
|
233
|
+
return (double)actualWrite;
|
|
234
|
+
} else if (encoding == "binary" || encoding == "latin1") {
|
|
235
|
+
// Decode UTF-8 string back to raw bytes (0x00-0xFF)
|
|
236
|
+
size_t written = 0;
|
|
237
|
+
size_t i = 0;
|
|
238
|
+
const char *str = string.c_str();
|
|
239
|
+
size_t utf8Len = string.length();
|
|
240
|
+
|
|
241
|
+
while (i < utf8Len && written < toWrite) {
|
|
242
|
+
unsigned char byte = static_cast<unsigned char>(str[i]);
|
|
243
|
+
uint32_t codePoint = 0;
|
|
244
|
+
size_t seqLen = 0;
|
|
245
|
+
|
|
246
|
+
if (byte <= 0x7F) {
|
|
247
|
+
codePoint = byte;
|
|
248
|
+
seqLen = 1;
|
|
249
|
+
} else if ((byte & 0xE0) == 0xC0 && i + 1 < utf8Len) {
|
|
250
|
+
codePoint = ((byte & 0x1F) << 6) |
|
|
251
|
+
(static_cast<unsigned char>(str[i + 1]) & 0x3F);
|
|
252
|
+
seqLen = 2;
|
|
253
|
+
} else if ((byte & 0xF0) == 0xE0 && i + 2 < utf8Len) {
|
|
254
|
+
codePoint = ((byte & 0x0F) << 12) |
|
|
255
|
+
((static_cast<unsigned char>(str[i + 1]) & 0x3F) << 6) |
|
|
256
|
+
(static_cast<unsigned char>(str[i + 2]) & 0x3F);
|
|
257
|
+
seqLen = 3;
|
|
258
|
+
} else if ((byte & 0xF8) == 0xF0 && i + 3 < utf8Len) {
|
|
259
|
+
codePoint = ((byte & 0x07) << 18) |
|
|
260
|
+
((static_cast<unsigned char>(str[i + 1]) & 0x3F) << 12) |
|
|
261
|
+
((static_cast<unsigned char>(str[i + 2]) & 0x3F) << 6) |
|
|
262
|
+
(static_cast<unsigned char>(str[i + 3]) & 0x3F);
|
|
263
|
+
seqLen = 4;
|
|
264
|
+
} else {
|
|
265
|
+
codePoint = byte;
|
|
266
|
+
seqLen = 1;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
data[start + written++] = static_cast<uint8_t>(codePoint & 0xFF);
|
|
270
|
+
i += seqLen;
|
|
271
|
+
}
|
|
272
|
+
return (double)written;
|
|
211
273
|
}
|
|
212
274
|
|
|
213
275
|
// Fallback utf8
|
|
214
276
|
size_t strLen = string.length();
|
|
215
277
|
size_t actualWrite = std::min(toWrite, strLen);
|
|
216
278
|
memcpy(data + start, string.c_str(), actualWrite);
|
|
217
|
-
return actualWrite;
|
|
279
|
+
return (double)actualWrite;
|
|
218
280
|
}
|
|
219
281
|
|
|
220
282
|
// UTF-8 replacement character (U+FFFD) encoded as UTF-8
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# NitroBuffer+autolinking.cmake
|
|
3
3
|
# This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
4
|
# https://github.com/mrousavy/nitro
|
|
5
|
-
# Copyright ©
|
|
5
|
+
# Copyright © Marc Rousavy @ Margelo
|
|
6
6
|
#
|
|
7
7
|
|
|
8
8
|
# This is a CMake file that adds all files generated by Nitrogen
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/// NitroBuffer+autolinking.gradle
|
|
3
3
|
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
4
|
/// https://github.com/mrousavy/nitro
|
|
5
|
-
/// Copyright ©
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
6
|
///
|
|
7
7
|
|
|
8
8
|
/// This is a Gradle file that adds all files generated by Nitrogen
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/// NitroBufferOnLoad.cpp
|
|
3
3
|
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
4
|
/// https://github.com/mrousavy/nitro
|
|
5
|
-
/// Copyright ©
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
6
|
///
|
|
7
7
|
|
|
8
8
|
#ifndef BUILDING_NITROBUFFER_WITH_GENERATED_CMAKE_PROJECT
|
|
@@ -20,25 +20,30 @@
|
|
|
20
20
|
namespace margelo::nitro::buffer {
|
|
21
21
|
|
|
22
22
|
int initialize(JavaVM* vm) {
|
|
23
|
+
return facebook::jni::initialize(vm, []() {
|
|
24
|
+
::margelo::nitro::buffer::registerAllNatives();
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
void registerAllNatives() {
|
|
23
31
|
using namespace margelo::nitro;
|
|
24
32
|
using namespace margelo::nitro::buffer;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
);
|
|
41
|
-
});
|
|
33
|
+
|
|
34
|
+
// Register native JNI methods
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
// Register Nitro Hybrid Objects
|
|
38
|
+
HybridObjectRegistry::registerHybridObjectConstructor(
|
|
39
|
+
"NitroBuffer",
|
|
40
|
+
[]() -> std::shared_ptr<HybridObject> {
|
|
41
|
+
static_assert(std::is_default_constructible_v<HybridNitroBuffer>,
|
|
42
|
+
"The HybridObject \"HybridNitroBuffer\" is not default-constructible! "
|
|
43
|
+
"Create a public constructor that takes zero arguments to be able to autolink this HybridObject.");
|
|
44
|
+
return std::make_shared<HybridNitroBuffer>();
|
|
45
|
+
}
|
|
46
|
+
);
|
|
42
47
|
}
|
|
43
48
|
|
|
44
49
|
} // namespace margelo::nitro::buffer
|
|
@@ -2,24 +2,33 @@
|
|
|
2
2
|
/// NitroBufferOnLoad.hpp
|
|
3
3
|
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
4
|
/// https://github.com/mrousavy/nitro
|
|
5
|
-
/// Copyright ©
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
6
|
///
|
|
7
7
|
|
|
8
8
|
#include <jni.h>
|
|
9
|
+
#include <functional>
|
|
9
10
|
#include <NitroModules/NitroDefines.hpp>
|
|
10
11
|
|
|
11
12
|
namespace margelo::nitro::buffer {
|
|
12
13
|
|
|
14
|
+
[[deprecated("Use registerNatives() instead.")]]
|
|
15
|
+
int initialize(JavaVM* vm);
|
|
16
|
+
|
|
13
17
|
/**
|
|
14
|
-
*
|
|
15
|
-
* Call this in your `JNI_OnLoad` function (probably inside `cpp-adapter.cpp`)
|
|
18
|
+
* Register the native (C++) part of NitroBuffer, and autolinks all Hybrid Objects.
|
|
19
|
+
* Call this in your `JNI_OnLoad` function (probably inside `cpp-adapter.cpp`),
|
|
20
|
+
* inside a `facebook::jni::initialize(vm, ...)` call.
|
|
16
21
|
* Example:
|
|
17
22
|
* ```cpp (cpp-adapter.cpp)
|
|
18
23
|
* JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
|
|
19
|
-
* return
|
|
24
|
+
* return facebook::jni::initialize(vm, []() {
|
|
25
|
+
* // register all NitroBuffer HybridObjects
|
|
26
|
+
* margelo::nitro::buffer::registerNatives();
|
|
27
|
+
* // any other custom registrations go here.
|
|
28
|
+
* });
|
|
20
29
|
* }
|
|
21
30
|
* ```
|
|
22
31
|
*/
|
|
23
|
-
|
|
32
|
+
void registerAllNatives();
|
|
24
33
|
|
|
25
34
|
} // namespace margelo::nitro::buffer
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# NitroBuffer+autolinking.rb
|
|
3
3
|
# This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
4
|
# https://github.com/mrousavy/nitro
|
|
5
|
-
# Copyright ©
|
|
5
|
+
# Copyright © Marc Rousavy @ Margelo
|
|
6
6
|
#
|
|
7
7
|
|
|
8
8
|
# This is a Ruby script that adds all files generated by Nitrogen
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/// NitroBuffer-Swift-Cxx-Bridge.cpp
|
|
3
3
|
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
4
|
/// https://github.com/mrousavy/nitro
|
|
5
|
-
/// Copyright ©
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
6
|
///
|
|
7
7
|
|
|
8
8
|
#include "NitroBuffer-Swift-Cxx-Bridge.hpp"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/// NitroBufferAutolinking.mm
|
|
3
3
|
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
4
|
/// https://github.com/mrousavy/nitro
|
|
5
|
-
/// Copyright ©
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
6
|
///
|
|
7
7
|
|
|
8
8
|
#import <Foundation/Foundation.h>
|
|
@@ -2,9 +2,13 @@
|
|
|
2
2
|
/// NitroBufferAutolinking.swift
|
|
3
3
|
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
4
|
/// https://github.com/mrousavy/nitro
|
|
5
|
-
/// Copyright ©
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
6
|
///
|
|
7
7
|
|
|
8
|
+
import NitroModules
|
|
9
|
+
|
|
10
|
+
// TODO: Use empty enums once Swift supports exporting them as namespaces
|
|
11
|
+
// See: https://github.com/swiftlang/swift/pull/83616
|
|
8
12
|
public final class NitroBufferAutolinking {
|
|
9
13
|
public typealias bridge = margelo.nitro.buffer.bridge.swift
|
|
10
14
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/// HybridNitroBufferSpec.cpp
|
|
3
3
|
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
4
|
/// https://github.com/mrousavy/nitro
|
|
5
|
-
/// Copyright ©
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
6
|
///
|
|
7
7
|
|
|
8
8
|
#include "HybridNitroBufferSpec.hpp"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-nitro-buffer",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "The fastest, 100% Node.js-compatible Buffer implementation for React Native, powered by Nitro Modules and C++.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"types": "lib/index.d.ts",
|
|
9
9
|
"react-native": "src/index.ts",
|
|
10
10
|
"scripts": {
|
|
11
|
-
"build": "npx nitrogen@0.
|
|
11
|
+
"build": "npx nitrogen@0.35.0 && tsc",
|
|
12
12
|
"test": "jest",
|
|
13
13
|
"prepublishOnly": "npm run build"
|
|
14
14
|
},
|
|
@@ -25,14 +25,14 @@
|
|
|
25
25
|
"peerDependencies": {
|
|
26
26
|
"react": "*",
|
|
27
27
|
"react-native": "*",
|
|
28
|
-
"react-native-nitro-modules": "^0.
|
|
28
|
+
"react-native-nitro-modules": "^0.35.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/jest": "^30.0.0",
|
|
32
32
|
"@types/node": "^18.19.130",
|
|
33
33
|
"@types/react": "*",
|
|
34
34
|
"jest": "^29.0.0",
|
|
35
|
-
"react-native-nitro-modules": "^0.
|
|
35
|
+
"react-native-nitro-modules": "^0.35.0",
|
|
36
36
|
"ts-jest": "^29.0.0",
|
|
37
37
|
"typescript": "^5.0.0"
|
|
38
38
|
},
|