react-native-nitro-dgram 0.1.4

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 (74) hide show
  1. package/android/CMakeLists.txt +24 -0
  2. package/android/OnLoad.cpp +6 -0
  3. package/android/build.gradle +64 -0
  4. package/android/libs/arm64-v8a/librust_c_udp.so +0 -0
  5. package/android/libs/armeabi-v7a/librust_c_udp.so +0 -0
  6. package/android/libs/x86/librust_c_udp.so +0 -0
  7. package/android/libs/x86_64/librust_c_udp.so +0 -0
  8. package/android/src/main/java/com/margelo/nitro/udp/NitroUdpPackage.java +25 -0
  9. package/cpp/HybridUdpDriver.cpp +21 -0
  10. package/cpp/HybridUdpDriver.hpp +18 -0
  11. package/cpp/HybridUdpSocketDriver.cpp +252 -0
  12. package/cpp/HybridUdpSocketDriver.hpp +88 -0
  13. package/cpp/UdpBindings.hpp +83 -0
  14. package/cpp/UdpManager.hpp +108 -0
  15. package/ios/Frameworks/RustCUdp.xcframework/Info.plist +44 -0
  16. package/ios/Frameworks/RustCUdp.xcframework/ios-arm64/RustCUdp.framework/Info.plist +20 -0
  17. package/ios/Frameworks/RustCUdp.xcframework/ios-arm64/RustCUdp.framework/RustCUdp +0 -0
  18. package/ios/Frameworks/RustCUdp.xcframework/ios-arm64_x86_64-simulator/RustCUdp.framework/Info.plist +20 -0
  19. package/ios/Frameworks/RustCUdp.xcframework/ios-arm64_x86_64-simulator/RustCUdp.framework/RustCUdp +0 -0
  20. package/lib/Driver.d.ts +2 -0
  21. package/lib/Driver.js +6 -0
  22. package/lib/Driver.js.map +1 -0
  23. package/lib/Udp.nitro.d.ts +54 -0
  24. package/lib/Udp.nitro.js +3 -0
  25. package/lib/Udp.nitro.js.map +1 -0
  26. package/lib/index.d.ts +82 -0
  27. package/lib/index.js +375 -0
  28. package/lib/index.js.map +1 -0
  29. package/nitrogen/generated/.gitattributes +1 -0
  30. package/nitrogen/generated/android/RustCUdp+autolinking.cmake +84 -0
  31. package/nitrogen/generated/android/RustCUdp+autolinking.gradle +27 -0
  32. package/nitrogen/generated/android/RustCUdpOnLoad.cpp +53 -0
  33. package/nitrogen/generated/android/RustCUdpOnLoad.hpp +25 -0
  34. package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
  35. package/nitrogen/generated/android/c++/JFunc_void_std__shared_ptr_ArrayBuffer__std__string_double.hpp +78 -0
  36. package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
  37. package/nitrogen/generated/android/c++/JHybridUdpDriverSpec.cpp +57 -0
  38. package/nitrogen/generated/android/c++/JHybridUdpDriverSpec.hpp +65 -0
  39. package/nitrogen/generated/android/c++/JHybridUdpSocketDriverSpec.cpp +261 -0
  40. package/nitrogen/generated/android/c++/JHybridUdpSocketDriverSpec.hpp +97 -0
  41. package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/Func_void.kt +80 -0
  42. package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/Func_void_std__shared_ptr_ArrayBuffer__std__string_double.kt +80 -0
  43. package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/Func_void_std__string.kt +80 -0
  44. package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/HybridUdpDriverSpec.kt +57 -0
  45. package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/HybridUdpSocketDriverSpec.kt +212 -0
  46. package/nitrogen/generated/android/kotlin/com/margelo/nitro/udp/RustCUdpOnLoad.kt +35 -0
  47. package/nitrogen/generated/ios/RustCUdp+autolinking.rb +60 -0
  48. package/nitrogen/generated/ios/RustCUdp-Swift-Cxx-Bridge.cpp +74 -0
  49. package/nitrogen/generated/ios/RustCUdp-Swift-Cxx-Bridge.hpp +195 -0
  50. package/nitrogen/generated/ios/RustCUdp-Swift-Cxx-Umbrella.hpp +53 -0
  51. package/nitrogen/generated/ios/RustCUdpAutolinking.mm +35 -0
  52. package/nitrogen/generated/ios/RustCUdpAutolinking.swift +12 -0
  53. package/nitrogen/generated/ios/c++/HybridUdpDriverSpecSwift.cpp +11 -0
  54. package/nitrogen/generated/ios/c++/HybridUdpDriverSpecSwift.hpp +80 -0
  55. package/nitrogen/generated/ios/c++/HybridUdpSocketDriverSpecSwift.cpp +11 -0
  56. package/nitrogen/generated/ios/c++/HybridUdpSocketDriverSpecSwift.hpp +302 -0
  57. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  58. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer__std__string_double.swift +47 -0
  59. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  60. package/nitrogen/generated/ios/swift/HybridUdpDriverSpec.swift +56 -0
  61. package/nitrogen/generated/ios/swift/HybridUdpDriverSpec_cxx.swift +141 -0
  62. package/nitrogen/generated/ios/swift/HybridUdpSocketDriverSpec.swift +84 -0
  63. package/nitrogen/generated/ios/swift/HybridUdpSocketDriverSpec_cxx.swift +527 -0
  64. package/nitrogen/generated/shared/c++/HybridNitroBufferSpec.cpp +32 -0
  65. package/nitrogen/generated/shared/c++/HybridNitroBufferSpec.hpp +74 -0
  66. package/nitrogen/generated/shared/c++/HybridUdpDriverSpec.cpp +21 -0
  67. package/nitrogen/generated/shared/c++/HybridUdpDriverSpec.hpp +66 -0
  68. package/nitrogen/generated/shared/c++/HybridUdpSocketDriverSpec.cpp +54 -0
  69. package/nitrogen/generated/shared/c++/HybridUdpSocketDriverSpec.hpp +98 -0
  70. package/package.json +59 -0
  71. package/react-native-nitro-dgram.podspec +45 -0
  72. package/src/Driver.ts +4 -0
  73. package/src/Udp.nitro.ts +55 -0
  74. package/src/index.ts +414 -0
package/lib/index.js ADDED
@@ -0,0 +1,375 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Socket = exports.BlockList = void 0;
4
+ exports.createSocket = createSocket;
5
+ const eventemitter3_1 = require("eventemitter3");
6
+ const Driver_1 = require("./Driver");
7
+ const react_native_nitro_buffer_1 = require("react-native-nitro-buffer");
8
+ /**
9
+ * 100% compatible with Node.js dgram module.
10
+ */
11
+ function isIP(input) {
12
+ if (/^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/.test(input))
13
+ return 4;
14
+ if (/^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/.test(input))
15
+ return 6;
16
+ if (/^((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)$/.test(input))
17
+ return 6;
18
+ return 0;
19
+ }
20
+ class BlockList {
21
+ _rules = [];
22
+ addAddress(address, family = 'ipv4') {
23
+ this._rules.push({ type: 'address', data: { address, family } });
24
+ }
25
+ addRange(start, end, family = 'ipv4') {
26
+ this._rules.push({ type: 'range', data: { start, end, family } });
27
+ }
28
+ addSubnet(net, prefix, family = 'ipv4') {
29
+ this._rules.push({ type: 'subnet', data: { net, prefix, family } });
30
+ }
31
+ check(address, family = 'ipv4') {
32
+ // Simple implementation for now
33
+ for (const rule of this._rules) {
34
+ if (rule.type === 'address' && rule.data.address === address)
35
+ return true;
36
+ // Range and subnet check would need IP calculation logic
37
+ }
38
+ return false;
39
+ }
40
+ }
41
+ exports.BlockList = BlockList;
42
+ class Socket extends eventemitter3_1.EventEmitter {
43
+ _driver;
44
+ _type;
45
+ _bound = false;
46
+ _closed = false;
47
+ _connected = false;
48
+ _signal;
49
+ _lookup;
50
+ _receiveBlockList;
51
+ _sendBlockList;
52
+ constructor(type) {
53
+ super();
54
+ const options = typeof type === 'string' ? { type } : type;
55
+ this._type = options.type;
56
+ this._lookup = options.lookup;
57
+ this._receiveBlockList = options.receiveBlockList;
58
+ this._sendBlockList = options.sendBlockList;
59
+ this._driver = Driver_1.Driver.createSocket();
60
+ this._setupEvents();
61
+ if (options.signal) {
62
+ this._signal = options.signal;
63
+ if (this._signal.aborted) {
64
+ setImmediate(() => this.close());
65
+ }
66
+ else {
67
+ this._signal.addEventListener('abort', () => {
68
+ this.close();
69
+ });
70
+ }
71
+ }
72
+ }
73
+ async [Symbol.asyncDispose]() {
74
+ if (this._closed)
75
+ return;
76
+ return new Promise((resolve) => {
77
+ this.once('close', resolve);
78
+ this.close();
79
+ });
80
+ }
81
+ _setupEvents() {
82
+ this._driver.onMessage = (data, address, port) => {
83
+ const family = isIP(address) === 6 ? 'IPv6' : 'IPv4';
84
+ if (this._receiveBlockList && this._receiveBlockList.check(address, family === 'IPv6' ? 'ipv6' : 'ipv4')) {
85
+ return; // Discard blocked message
86
+ }
87
+ const buffer = react_native_nitro_buffer_1.Buffer.from(data);
88
+ const rinfo = {
89
+ address,
90
+ family,
91
+ port,
92
+ size: buffer.length
93
+ };
94
+ this.emit('message', buffer, rinfo);
95
+ };
96
+ this._driver.onConnect = () => {
97
+ this._connected = true;
98
+ this.emit('connect');
99
+ };
100
+ this._driver.onError = (error) => {
101
+ this.emit('error', new Error(error));
102
+ };
103
+ this._driver.onClose = () => {
104
+ this._closed = true;
105
+ this.emit('close');
106
+ };
107
+ }
108
+ bind(arg1, arg2, arg3) {
109
+ if (this._bound)
110
+ throw new Error('Already bound');
111
+ let port = 0;
112
+ let address = '';
113
+ let callback;
114
+ if (typeof arg1 === 'object' && arg1 !== null) {
115
+ port = arg1.port || 0;
116
+ address = arg1.address || '';
117
+ callback = arg2;
118
+ }
119
+ else {
120
+ port = arg1 || 0;
121
+ address = arg2 || '';
122
+ callback = arg3;
123
+ }
124
+ if (callback)
125
+ this.once('listening', callback);
126
+ const ipv6Only = false; // TODO: handle from options
127
+ const result = this._driver.bind(port, address, ipv6Only);
128
+ if (result === 0) {
129
+ this._bound = true;
130
+ setImmediate(() => this.emit('listening'));
131
+ }
132
+ else {
133
+ setImmediate(() => this.emit('error', new Error(`Bind failed with code ${result}`)));
134
+ }
135
+ return this;
136
+ }
137
+ connect(port, address, callback) {
138
+ if (this._closed)
139
+ throw new Error('Socket is closed');
140
+ if (!this._bound) {
141
+ this.bind(0);
142
+ }
143
+ if (callback)
144
+ this.once('connect', callback);
145
+ const targetAddress = address || (this._type === 'udp4' ? '127.0.0.1' : '::1');
146
+ const result = this._driver.connect(port, targetAddress);
147
+ if (result !== 0) {
148
+ setImmediate(() => this.emit('error', new Error(`Connect failed with code ${result}`)));
149
+ }
150
+ }
151
+ disconnect() {
152
+ if (this._closed)
153
+ throw new Error('Socket is closed');
154
+ if (!this._connected)
155
+ return;
156
+ const result = this._driver.disconnect();
157
+ if (result === 0) {
158
+ this._connected = false;
159
+ }
160
+ else {
161
+ // Some platforms might not support disconnect directy
162
+ // If disconnect failed but node says it should work, we might need to recreate socket
163
+ // but for now we'll just emit error or ignore if it's ENOTSUP
164
+ }
165
+ }
166
+ send(msg, ...args) {
167
+ if (this._closed)
168
+ throw new Error('Socket is closed');
169
+ let offset = 0;
170
+ let length = 0;
171
+ let port = 0;
172
+ let address = '';
173
+ let callback;
174
+ // Node.js send() behavior:
175
+ // If connected, port and address should not be provided.
176
+ // If not connected, port and address must be provided.
177
+ if (!this._bound) {
178
+ this.bind(0);
179
+ }
180
+ if (this._connected) {
181
+ // (msg, [offset, length,] [callback])
182
+ if (typeof args[0] === 'function') {
183
+ callback = args[0];
184
+ length = msg.length;
185
+ }
186
+ else if (typeof args[0] === 'number' && typeof args[1] === 'number') {
187
+ offset = args[0];
188
+ length = args[1];
189
+ callback = args[2];
190
+ }
191
+ else {
192
+ length = msg.length;
193
+ }
194
+ // Use connected peer info
195
+ port = this._driver.getRemotePort();
196
+ address = this._driver.getRemoteAddress();
197
+ }
198
+ else {
199
+ // (msg, [offset, length,] port [, address] [, callback])
200
+ if (args.length >= 4) {
201
+ // (msg, offset, length, port, address, callback)
202
+ offset = args[0];
203
+ length = args[1];
204
+ port = args[2];
205
+ address = args[3] || '127.0.0.1';
206
+ callback = args[4];
207
+ }
208
+ else {
209
+ // (msg, port, address, callback)
210
+ port = args[0];
211
+ address = args[1] || '127.0.0.1';
212
+ callback = args[2];
213
+ length = msg.length;
214
+ }
215
+ }
216
+ const handleSend = (targetAddress) => {
217
+ const family = isIP(targetAddress) === 6 ? 'IPv6' : 'IPv4';
218
+ if (this._sendBlockList && this._sendBlockList.check(targetAddress, family === 'IPv6' ? 'ipv6' : 'ipv4')) {
219
+ const err = new Error(`Address ${targetAddress} is blocked by sendBlockList`);
220
+ if (callback)
221
+ setImmediate(() => callback(err, 0));
222
+ else
223
+ this.emit('error', err);
224
+ return;
225
+ }
226
+ let bytesSent = 0;
227
+ if (Array.isArray(msg)) {
228
+ const abs = msg.map(m => {
229
+ const b = react_native_nitro_buffer_1.Buffer.from(m);
230
+ return b.buffer.slice(b.byteOffset, b.byteOffset + b.byteLength);
231
+ });
232
+ bytesSent = this._driver.sendMultiple(abs, port, targetAddress);
233
+ }
234
+ else {
235
+ const buffer = react_native_nitro_buffer_1.Buffer.from(msg);
236
+ const finalBuffer = (offset === 0 && (length === 0 || length === buffer.length))
237
+ ? buffer
238
+ : buffer.slice(offset, offset + (length || buffer.length));
239
+ const ab = finalBuffer.buffer.slice(finalBuffer.byteOffset, finalBuffer.byteOffset + finalBuffer.byteLength);
240
+ bytesSent = this._driver.send(ab, port, targetAddress);
241
+ }
242
+ if (callback) {
243
+ if (bytesSent >= 0) {
244
+ setImmediate(() => callback(null, bytesSent));
245
+ }
246
+ else {
247
+ setImmediate(() => callback(new Error(`Send failed with code ${bytesSent}`), 0));
248
+ }
249
+ }
250
+ };
251
+ if (this._lookup && isIP(address) === 0 && !this._connected && address !== '') {
252
+ this._lookup(address, {}, (err, resolvedAddr) => {
253
+ if (err) {
254
+ if (callback)
255
+ callback(err, 0);
256
+ else
257
+ this.emit('error', err);
258
+ return;
259
+ }
260
+ handleSend(resolvedAddr);
261
+ });
262
+ }
263
+ else {
264
+ handleSend(address);
265
+ }
266
+ }
267
+ close(callback) {
268
+ if (this._closed) {
269
+ if (callback)
270
+ setImmediate(callback);
271
+ return this;
272
+ }
273
+ if (callback)
274
+ this.once('close', callback);
275
+ // Only bound sockets have native listener, so only they receive native onClose
276
+ if (this._bound) {
277
+ this._driver.close();
278
+ }
279
+ else {
280
+ // For unbound sockets, emit close directly since native layer won't
281
+ this._closed = true;
282
+ setImmediate(() => this.emit('close'));
283
+ }
284
+ return this;
285
+ }
286
+ address() {
287
+ return {
288
+ address: this._driver.getLocalAddress(),
289
+ family: this._type === 'udp6' ? 'IPv6' : 'IPv4',
290
+ port: this._driver.getLocalPort()
291
+ };
292
+ }
293
+ remoteAddress() {
294
+ if (!this._connected)
295
+ throw new Error('Socket is not connected');
296
+ return {
297
+ address: this._driver.getRemoteAddress(),
298
+ family: isIP(this._driver.getRemoteAddress()) === 6 ? 'IPv6' : 'IPv4',
299
+ port: this._driver.getRemotePort()
300
+ };
301
+ }
302
+ setBroadcast(flag) {
303
+ this._driver.setBroadcast(flag);
304
+ }
305
+ setTTL(ttl) {
306
+ this._driver.setTTL(ttl);
307
+ }
308
+ setMulticastTTL(ttl) {
309
+ this._driver.setMulticastTTL(ttl);
310
+ }
311
+ setMulticastLoopback(flag) {
312
+ this._driver.setMulticastLoopback(flag);
313
+ }
314
+ setMulticastInterface(interfaceAddress) {
315
+ this._driver.setMulticastInterface(interfaceAddress);
316
+ }
317
+ addMembership(multicastAddress, interfaceAddress) {
318
+ this._driver.addMembership(multicastAddress, interfaceAddress);
319
+ }
320
+ dropMembership(multicastAddress, interfaceAddress) {
321
+ this._driver.dropMembership(multicastAddress, interfaceAddress);
322
+ }
323
+ addSourceSpecificMembership(sourceAddress, groupAddress, interfaceAddress) {
324
+ this._driver.addSourceSpecificMembership(sourceAddress, groupAddress, interfaceAddress);
325
+ }
326
+ dropSourceSpecificMembership(sourceAddress, groupAddress, interfaceAddress) {
327
+ this._driver.dropSourceSpecificMembership(sourceAddress, groupAddress, interfaceAddress);
328
+ }
329
+ getRecvBufferSize() {
330
+ if (this._driver.id === 0)
331
+ throw new Error('Socket is not bound');
332
+ return this._driver.getRecvBufferSize();
333
+ }
334
+ setRecvBufferSize(size) {
335
+ if (this._driver.id === 0)
336
+ throw new Error('Socket is not bound');
337
+ this._driver.setRecvBufferSize(size);
338
+ }
339
+ getSendBufferSize() {
340
+ if (this._driver.id === 0)
341
+ throw new Error('Socket is not bound');
342
+ return this._driver.getSendBufferSize();
343
+ }
344
+ setSendBufferSize(size) {
345
+ if (this._driver.id === 0)
346
+ throw new Error('Socket is not bound');
347
+ this._driver.setSendBufferSize(size);
348
+ }
349
+ getSendQueueCount() {
350
+ if (this._driver.id === 0)
351
+ return 0;
352
+ return this._driver.getSendQueueCount();
353
+ }
354
+ getSendQueueSize() {
355
+ if (this._driver.id === 0)
356
+ return 0;
357
+ return this._driver.getSendQueueSize();
358
+ }
359
+ ref() { return this; }
360
+ unref() { return this; }
361
+ }
362
+ exports.Socket = Socket;
363
+ function createSocket(type, callback) {
364
+ const socket = new Socket(type);
365
+ if (callback) {
366
+ socket.on('message', callback);
367
+ }
368
+ return socket;
369
+ }
370
+ exports.default = {
371
+ createSocket,
372
+ Socket,
373
+ BlockList
374
+ };
375
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ ** linguist-generated=true
@@ -0,0 +1,84 @@
1
+ #
2
+ # RustCUdp+autolinking.cmake
3
+ # This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ # https://github.com/mrousavy/nitro
5
+ # Copyright © 2025 Marc Rousavy @ Margelo
6
+ #
7
+
8
+ # This is a CMake file that adds all files generated by Nitrogen
9
+ # to the current CMake project.
10
+ #
11
+ # To use it, add this to your CMakeLists.txt:
12
+ # ```cmake
13
+ # include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/RustCUdp+autolinking.cmake)
14
+ # ```
15
+
16
+ # Define a flag to check if we are building properly
17
+ add_definitions(-DBUILDING_RUSTCUDP_WITH_GENERATED_CMAKE_PROJECT)
18
+
19
+ # Enable Raw Props parsing in react-native (for Nitro Views)
20
+ add_definitions(-DRN_SERIALIZABLE_STATE)
21
+
22
+ # Add all headers that were generated by Nitrogen
23
+ include_directories(
24
+ "../nitrogen/generated/shared/c++"
25
+ "../nitrogen/generated/android/c++"
26
+ "../nitrogen/generated/android/"
27
+ )
28
+
29
+ # Add all .cpp sources that were generated by Nitrogen
30
+ target_sources(
31
+ # CMake project name (Android C++ library name)
32
+ RustCUdp PRIVATE
33
+ # Autolinking Setup
34
+ ../nitrogen/generated/android/RustCUdpOnLoad.cpp
35
+ # Shared Nitrogen C++ sources
36
+ ../nitrogen/generated/shared/c++/HybridUdpSocketDriverSpec.cpp
37
+ ../nitrogen/generated/shared/c++/HybridUdpDriverSpec.cpp
38
+ ../nitrogen/generated/shared/c++/HybridNitroBufferSpec.cpp
39
+ # Android-specific Nitrogen C++ sources
40
+ ../nitrogen/generated/android/c++/JHybridUdpSocketDriverSpec.cpp
41
+ ../nitrogen/generated/android/c++/JHybridUdpDriverSpec.cpp
42
+ )
43
+
44
+ # From node_modules/react-native/ReactAndroid/cmake-utils/folly-flags.cmake
45
+ # Used in node_modules/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake
46
+ target_compile_definitions(
47
+ RustCUdp PRIVATE
48
+ -DFOLLY_NO_CONFIG=1
49
+ -DFOLLY_HAVE_CLOCK_GETTIME=1
50
+ -DFOLLY_USE_LIBCPP=1
51
+ -DFOLLY_CFG_NO_COROUTINES=1
52
+ -DFOLLY_MOBILE=1
53
+ -DFOLLY_HAVE_RECVMMSG=1
54
+ -DFOLLY_HAVE_PTHREAD=1
55
+ # Once we target android-23 above, we can comment
56
+ # the following line. NDK uses GNU style stderror_r() after API 23.
57
+ -DFOLLY_HAVE_XSI_STRERROR_R=1
58
+ )
59
+
60
+ # Add all libraries required by the generated specs
61
+ find_package(fbjni REQUIRED) # <-- Used for communication between Java <-> C++
62
+ find_package(ReactAndroid REQUIRED) # <-- Used to set up React Native bindings (e.g. CallInvoker/TurboModule)
63
+ find_package(react-native-nitro-modules REQUIRED) # <-- Used to create all HybridObjects and use the Nitro core library
64
+
65
+ # Link all libraries together
66
+ target_link_libraries(
67
+ RustCUdp
68
+ fbjni::fbjni # <-- Facebook C++ JNI helpers
69
+ ReactAndroid::jsi # <-- RN: JSI
70
+ react-native-nitro-modules::NitroModules # <-- NitroModules Core :)
71
+ )
72
+
73
+ # Link react-native (different prefab between RN 0.75 and RN 0.76)
74
+ if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
75
+ target_link_libraries(
76
+ RustCUdp
77
+ ReactAndroid::reactnative # <-- RN: Native Modules umbrella prefab
78
+ )
79
+ else()
80
+ target_link_libraries(
81
+ RustCUdp
82
+ ReactAndroid::react_nativemodule_core # <-- RN: TurboModules Core
83
+ )
84
+ endif()
@@ -0,0 +1,27 @@
1
+ ///
2
+ /// RustCUdp+autolinking.gradle
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © 2025 Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ /// This is a Gradle file that adds all files generated by Nitrogen
9
+ /// to the current Gradle project.
10
+ ///
11
+ /// To use it, add this to your build.gradle:
12
+ /// ```gradle
13
+ /// apply from: '../nitrogen/generated/android/RustCUdp+autolinking.gradle'
14
+ /// ```
15
+
16
+ logger.warn("[NitroModules] 🔥 RustCUdp is boosted by nitro!")
17
+
18
+ android {
19
+ sourceSets {
20
+ main {
21
+ java.srcDirs += [
22
+ // Nitrogen files
23
+ "${project.projectDir}/../nitrogen/generated/android/kotlin"
24
+ ]
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,53 @@
1
+ ///
2
+ /// RustCUdpOnLoad.cpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © 2025 Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #ifndef BUILDING_RUSTCUDP_WITH_GENERATED_CMAKE_PROJECT
9
+ #error RustCUdpOnLoad.cpp is not being built with the autogenerated CMakeLists.txt project. Is a different CMakeLists.txt building this?
10
+ #endif
11
+
12
+ #include "RustCUdpOnLoad.hpp"
13
+
14
+ #include <jni.h>
15
+ #include <fbjni/fbjni.h>
16
+ #include <NitroModules/HybridObjectRegistry.hpp>
17
+
18
+ #include "JHybridUdpSocketDriverSpec.hpp"
19
+ #include "JFunc_void_std__shared_ptr_ArrayBuffer__std__string_double.hpp"
20
+ #include "JFunc_void.hpp"
21
+ #include "JFunc_void_std__string.hpp"
22
+ #include "JHybridUdpDriverSpec.hpp"
23
+ #include "HybridUdpDriver.hpp"
24
+
25
+ namespace margelo::nitro::udp {
26
+
27
+ int initialize(JavaVM* vm) {
28
+ using namespace margelo::nitro;
29
+ using namespace margelo::nitro::udp;
30
+ using namespace facebook;
31
+
32
+ return facebook::jni::initialize(vm, [] {
33
+ // Register native JNI methods
34
+ margelo::nitro::udp::JHybridUdpSocketDriverSpec::registerNatives();
35
+ margelo::nitro::udp::JFunc_void_std__shared_ptr_ArrayBuffer__std__string_double_cxx::registerNatives();
36
+ margelo::nitro::udp::JFunc_void_cxx::registerNatives();
37
+ margelo::nitro::udp::JFunc_void_std__string_cxx::registerNatives();
38
+ margelo::nitro::udp::JHybridUdpDriverSpec::registerNatives();
39
+
40
+ // Register Nitro Hybrid Objects
41
+ HybridObjectRegistry::registerHybridObjectConstructor(
42
+ "UdpDriver",
43
+ []() -> std::shared_ptr<HybridObject> {
44
+ static_assert(std::is_default_constructible_v<HybridUdpDriver>,
45
+ "The HybridObject \"HybridUdpDriver\" is not default-constructible! "
46
+ "Create a public constructor that takes zero arguments to be able to autolink this HybridObject.");
47
+ return std::make_shared<HybridUdpDriver>();
48
+ }
49
+ );
50
+ });
51
+ }
52
+
53
+ } // namespace margelo::nitro::udp
@@ -0,0 +1,25 @@
1
+ ///
2
+ /// RustCUdpOnLoad.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © 2025 Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #include <jni.h>
9
+ #include <NitroModules/NitroDefines.hpp>
10
+
11
+ namespace margelo::nitro::udp {
12
+
13
+ /**
14
+ * Initializes the native (C++) part of RustCUdp, and autolinks all Hybrid Objects.
15
+ * Call this in your `JNI_OnLoad` function (probably inside `cpp-adapter.cpp`).
16
+ * Example:
17
+ * ```cpp (cpp-adapter.cpp)
18
+ * JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
19
+ * return margelo::nitro::udp::initialize(vm);
20
+ * }
21
+ * ```
22
+ */
23
+ int initialize(JavaVM* vm);
24
+
25
+ } // namespace margelo::nitro::udp
@@ -0,0 +1,75 @@
1
+ ///
2
+ /// JFunc_void.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © 2025 Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ #include <fbjni/fbjni.h>
11
+ #include <functional>
12
+
13
+ #include <functional>
14
+ #include <NitroModules/JNICallable.hpp>
15
+
16
+ namespace margelo::nitro::udp {
17
+
18
+ using namespace facebook;
19
+
20
+ /**
21
+ * Represents the Java/Kotlin callback `() -> Unit`.
22
+ * This can be passed around between C++ and Java/Kotlin.
23
+ */
24
+ struct JFunc_void: public jni::JavaClass<JFunc_void> {
25
+ public:
26
+ static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/udp/Func_void;";
27
+
28
+ public:
29
+ /**
30
+ * Invokes the function this `JFunc_void` instance holds through JNI.
31
+ */
32
+ void invoke() const {
33
+ static const auto method = javaClassStatic()->getMethod<void()>("invoke");
34
+ method(self());
35
+ }
36
+ };
37
+
38
+ /**
39
+ * An implementation of Func_void that is backed by a C++ implementation (using `std::function<...>`)
40
+ */
41
+ class JFunc_void_cxx final: public jni::HybridClass<JFunc_void_cxx, JFunc_void> {
42
+ public:
43
+ static jni::local_ref<JFunc_void::javaobject> fromCpp(const std::function<void()>& func) {
44
+ return JFunc_void_cxx::newObjectCxxArgs(func);
45
+ }
46
+
47
+ public:
48
+ /**
49
+ * Invokes the C++ `std::function<...>` this `JFunc_void_cxx` instance holds.
50
+ */
51
+ void invoke_cxx() {
52
+ _func();
53
+ }
54
+
55
+ public:
56
+ [[nodiscard]]
57
+ inline const std::function<void()>& getFunction() const {
58
+ return _func;
59
+ }
60
+
61
+ public:
62
+ static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/udp/Func_void_cxx;";
63
+ static void registerNatives() {
64
+ registerHybrid({makeNativeMethod("invoke_cxx", JFunc_void_cxx::invoke_cxx)});
65
+ }
66
+
67
+ private:
68
+ explicit JFunc_void_cxx(const std::function<void()>& func): _func(func) { }
69
+
70
+ private:
71
+ friend HybridBase;
72
+ std::function<void()> _func;
73
+ };
74
+
75
+ } // namespace margelo::nitro::udp