react-native-nitro-net 0.2.0 → 0.3.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 (70) hide show
  1. package/README.md +70 -12
  2. package/android/libs/arm64-v8a/librust_c_net.so +0 -0
  3. package/android/libs/armeabi-v7a/librust_c_net.so +0 -0
  4. package/android/libs/x86/librust_c_net.so +0 -0
  5. package/android/libs/x86_64/librust_c_net.so +0 -0
  6. package/cpp/HybridHttpParser.hpp +67 -0
  7. package/cpp/HybridNetDriver.hpp +6 -0
  8. package/cpp/HybridNetServerDriver.hpp +7 -0
  9. package/cpp/HybridNetSocketDriver.hpp +27 -0
  10. package/cpp/NetBindings.hpp +15 -0
  11. package/ios/Frameworks/RustCNet.xcframework/Info.plist +5 -5
  12. package/ios/Frameworks/RustCNet.xcframework/ios-arm64/RustCNet.framework/RustCNet +0 -0
  13. package/ios/Frameworks/RustCNet.xcframework/ios-arm64_x86_64-simulator/RustCNet.framework/RustCNet +0 -0
  14. package/lib/Net.nitro.d.ts +19 -0
  15. package/lib/http.d.ts +203 -0
  16. package/lib/http.js +1138 -0
  17. package/lib/https.d.ts +24 -0
  18. package/lib/https.js +144 -0
  19. package/lib/index.d.ts +46 -8
  20. package/lib/index.js +133 -26
  21. package/lib/tls.d.ts +21 -0
  22. package/lib/tls.js +74 -4
  23. package/nitrogen/generated/android/RustCNet+autolinking.cmake +2 -0
  24. package/nitrogen/generated/android/RustCNetOnLoad.cpp +2 -0
  25. package/nitrogen/generated/android/c++/JHybridHttpParserSpec.cpp +54 -0
  26. package/nitrogen/generated/android/c++/JHybridHttpParserSpec.hpp +65 -0
  27. package/nitrogen/generated/android/c++/JHybridNetDriverSpec.cpp +9 -0
  28. package/nitrogen/generated/android/c++/JHybridNetDriverSpec.hpp +1 -0
  29. package/nitrogen/generated/android/c++/JHybridNetServerDriverSpec.cpp +4 -0
  30. package/nitrogen/generated/android/c++/JHybridNetServerDriverSpec.hpp +1 -0
  31. package/nitrogen/generated/android/c++/JHybridNetSocketDriverSpec.cpp +9 -0
  32. package/nitrogen/generated/android/c++/JHybridNetSocketDriverSpec.hpp +2 -0
  33. package/nitrogen/generated/android/c++/JNetConfig.hpp +7 -3
  34. package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridHttpParserSpec.kt +58 -0
  35. package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridNetDriverSpec.kt +4 -0
  36. package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridNetServerDriverSpec.kt +4 -0
  37. package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridNetSocketDriverSpec.kt +8 -0
  38. package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/NetConfig.kt +6 -3
  39. package/nitrogen/generated/ios/RustCNet-Swift-Cxx-Bridge.cpp +17 -0
  40. package/nitrogen/generated/ios/RustCNet-Swift-Cxx-Bridge.hpp +26 -0
  41. package/nitrogen/generated/ios/RustCNet-Swift-Cxx-Umbrella.hpp +5 -0
  42. package/nitrogen/generated/ios/c++/HybridHttpParserSpecSwift.cpp +11 -0
  43. package/nitrogen/generated/ios/c++/HybridHttpParserSpecSwift.hpp +79 -0
  44. package/nitrogen/generated/ios/c++/HybridNetDriverSpecSwift.hpp +11 -0
  45. package/nitrogen/generated/ios/c++/HybridNetServerDriverSpecSwift.hpp +6 -0
  46. package/nitrogen/generated/ios/c++/HybridNetSocketDriverSpecSwift.hpp +14 -0
  47. package/nitrogen/generated/ios/swift/HybridHttpParserSpec.swift +56 -0
  48. package/nitrogen/generated/ios/swift/HybridHttpParserSpec_cxx.swift +131 -0
  49. package/nitrogen/generated/ios/swift/HybridNetDriverSpec.swift +1 -0
  50. package/nitrogen/generated/ios/swift/HybridNetDriverSpec_cxx.swift +15 -0
  51. package/nitrogen/generated/ios/swift/HybridNetServerDriverSpec.swift +1 -0
  52. package/nitrogen/generated/ios/swift/HybridNetServerDriverSpec_cxx.swift +11 -0
  53. package/nitrogen/generated/ios/swift/HybridNetSocketDriverSpec.swift +2 -0
  54. package/nitrogen/generated/ios/swift/HybridNetSocketDriverSpec_cxx.swift +36 -0
  55. package/nitrogen/generated/ios/swift/NetConfig.swift +19 -1
  56. package/nitrogen/generated/shared/c++/HybridHttpParserSpec.cpp +21 -0
  57. package/nitrogen/generated/shared/c++/HybridHttpParserSpec.hpp +63 -0
  58. package/nitrogen/generated/shared/c++/HybridNetDriverSpec.cpp +1 -0
  59. package/nitrogen/generated/shared/c++/HybridNetDriverSpec.hpp +4 -0
  60. package/nitrogen/generated/shared/c++/HybridNetServerDriverSpec.cpp +1 -0
  61. package/nitrogen/generated/shared/c++/HybridNetServerDriverSpec.hpp +1 -0
  62. package/nitrogen/generated/shared/c++/HybridNetSocketDriverSpec.cpp +2 -0
  63. package/nitrogen/generated/shared/c++/HybridNetSocketDriverSpec.hpp +2 -0
  64. package/nitrogen/generated/shared/c++/NetConfig.hpp +6 -2
  65. package/package.json +3 -3
  66. package/src/Net.nitro.ts +17 -0
  67. package/src/http.ts +1304 -0
  68. package/src/https.ts +127 -0
  69. package/src/index.ts +149 -18
  70. package/src/tls.ts +82 -6
package/lib/tls.js CHANGED
@@ -11,6 +11,12 @@ exports.parseCertString = parseCertString;
11
11
  exports.convertTLSV1CertToPEM = convertTLSV1CertToPEM;
12
12
  const index_1 = require("./index");
13
13
  const Driver_1 = require("./Driver");
14
+ function debugLog(message) {
15
+ if ((0, index_1.isVerbose)()) {
16
+ const timestamp = new Date().toISOString().split('T')[1].split('Z')[0];
17
+ console.log(`[NET DEBUG ${timestamp}] ${message}`);
18
+ }
19
+ }
14
20
  exports.DEFAULT_MIN_VERSION = 'TLSv1.2';
15
21
  exports.DEFAULT_MAX_VERSION = 'TLSv1.3';
16
22
  exports.rootCertificates = [];
@@ -131,13 +137,48 @@ class TLSSocket extends index_1.Socket {
131
137
  }
132
138
  renegotiate(options, callback) {
133
139
  if (callback) {
134
- process.nextTick(() => callback(new Error('Renegotiation is not supported by rustls')));
140
+ setTimeout(() => {
141
+ const err = new Error('Renegotiation is not supported by rustls');
142
+ err.code = 'ERR_TLS_RENEGOTIATION_DISABLED';
143
+ callback(err);
144
+ }, 0);
135
145
  }
136
146
  return false;
137
147
  }
138
148
  disableRenegotiation() {
139
149
  // No-op, already effectively disabled
140
150
  }
151
+ /**
152
+ * Enables trace output for this socket.
153
+ */
154
+ enableTrace() {
155
+ const driver = this._driver;
156
+ if (driver) {
157
+ driver.enableTrace();
158
+ }
159
+ }
160
+ /**
161
+ * Exports keying material for use by external protocols.
162
+ *
163
+ * @param length The number of bytes to return.
164
+ * @param label A label identifying the keying material.
165
+ * @param context An optional context.
166
+ * @returns Buffer containing keying material.
167
+ * @throws Error if export fails (e.g., TLS not connected).
168
+ */
169
+ exportKeyingMaterial(length, label, context) {
170
+ const driver = this._driver;
171
+ if (driver) {
172
+ const ctx = context ? new Uint8Array(context).buffer : undefined;
173
+ const result = driver.exportKeyingMaterial(length, label, ctx);
174
+ if (result) {
175
+ return Buffer.from(result);
176
+ }
177
+ }
178
+ const err = new Error('exportKeyingMaterial failed: TLS connection may not be established');
179
+ err.code = 'ERR_TLS_EXPORT_KEYING_MATERIAL';
180
+ throw err;
181
+ }
141
182
  constructor(socketOrOptions, options) {
142
183
  let opts = {};
143
184
  if (socketOrOptions instanceof index_1.Socket) {
@@ -174,6 +215,21 @@ class TLSSocket extends index_1.Socket {
174
215
  if (connectionListener)
175
216
  this.once('secureConnect', connectionListener);
176
217
  this.once('connect', () => {
218
+ // After the native TLS handshake, perform hostname verification
219
+ if (rejectUnauthorized !== false) {
220
+ const cert = this.getPeerCertificate();
221
+ if (cert && Object.keys(cert).length > 0) {
222
+ const verifyFn = (typeof options === 'object' && options.checkServerIdentity)
223
+ ? options.checkServerIdentity
224
+ : checkServerIdentity;
225
+ const verifyErr = verifyFn(servername, cert);
226
+ if (verifyErr) {
227
+ this.emit('error', verifyErr);
228
+ this.destroy(verifyErr);
229
+ return;
230
+ }
231
+ }
232
+ }
177
233
  this.emit('secureConnect');
178
234
  });
179
235
  if (session) {
@@ -194,17 +250,21 @@ class TLSSocket extends index_1.Socket {
194
250
  }
195
251
  if (path) {
196
252
  if (secureContextId !== undefined) {
253
+ debugLog(`TLSSocket.connect: Calling driver.connectUnixTLSWithContext(${path}, ${servername}, ctx=${secureContextId})`);
197
254
  driver.connectUnixTLSWithContext(path, servername, rejectUnauthorized, secureContextId);
198
255
  }
199
256
  else {
257
+ debugLog(`TLSSocket.connect: Calling driver.connectUnixTLS(${path}, ${servername})`);
200
258
  driver.connectUnixTLS(path, servername, rejectUnauthorized);
201
259
  }
202
260
  }
203
261
  else {
204
262
  if (secureContextId !== undefined) {
263
+ debugLog(`TLSSocket.connect: Calling driver.connectTLSWithContext(${host}, ${port}, ${servername}, ctx=${secureContextId})`);
205
264
  driver.connectTLSWithContext(host, port, servername, rejectUnauthorized, secureContextId);
206
265
  }
207
266
  else {
267
+ debugLog(`TLSSocket.connect: Calling driver.connectTLS(${host}, ${port}, ${servername})`);
208
268
  driver.connectTLS(host, port, servername, rejectUnauthorized);
209
269
  }
210
270
  }
@@ -261,6 +321,10 @@ class Server extends index_1.Server {
261
321
  ca: options.ca
262
322
  }).id;
263
323
  }
324
+ else {
325
+ // Create empty secure context to allow late configuration (addContext)
326
+ this._secureContextId = createSecureContext().id;
327
+ }
264
328
  this.on('connection', (socket) => {
265
329
  const tlsSocket = new TLSSocket(socket);
266
330
  this.emit('secureConnection', tlsSocket);
@@ -338,10 +402,16 @@ class Server extends index_1.Server {
338
402
  if (_callback)
339
403
  this.once('listening', _callback);
340
404
  const driver = this._driver;
341
- if (handle || _path) {
342
- console.warn("TLS over Unix sockets/handles not fully implemented yet");
405
+ if (_path) {
406
+ driver.listenTLSUnix(_path, this._secureContextId, _backlog);
407
+ }
408
+ else if (handle) {
409
+ console.warn("TLS over handles not fully implemented yet");
410
+ driver.listenTLS(_port || 0, this._secureContextId, _backlog, ipv6Only, reusePort);
411
+ }
412
+ else {
413
+ driver.listenTLS(_port || 0, this._secureContextId, _backlog, ipv6Only, reusePort);
343
414
  }
344
- driver.listenTLS(_port || 0, this._secureContextId, _backlog, ipv6Only, reusePort);
345
415
  return this;
346
416
  }
347
417
  }
@@ -35,11 +35,13 @@ target_sources(
35
35
  # Shared Nitrogen C++ sources
36
36
  ../nitrogen/generated/shared/c++/HybridNetSocketDriverSpec.cpp
37
37
  ../nitrogen/generated/shared/c++/HybridNetServerDriverSpec.cpp
38
+ ../nitrogen/generated/shared/c++/HybridHttpParserSpec.cpp
38
39
  ../nitrogen/generated/shared/c++/HybridNetDriverSpec.cpp
39
40
  ../nitrogen/generated/shared/c++/HybridNitroBufferSpec.cpp
40
41
  # Android-specific Nitrogen C++ sources
41
42
  ../nitrogen/generated/android/c++/JHybridNetSocketDriverSpec.cpp
42
43
  ../nitrogen/generated/android/c++/JHybridNetServerDriverSpec.cpp
44
+ ../nitrogen/generated/android/c++/JHybridHttpParserSpec.cpp
43
45
  ../nitrogen/generated/android/c++/JHybridNetDriverSpec.cpp
44
46
  )
45
47
 
@@ -18,6 +18,7 @@
18
18
  #include "JHybridNetSocketDriverSpec.hpp"
19
19
  #include "JFunc_void_double_std__shared_ptr_ArrayBuffer_.hpp"
20
20
  #include "JHybridNetServerDriverSpec.hpp"
21
+ #include "JHybridHttpParserSpec.hpp"
21
22
  #include "JHybridNetDriverSpec.hpp"
22
23
  #include "HybridNetDriver.hpp"
23
24
 
@@ -33,6 +34,7 @@ int initialize(JavaVM* vm) {
33
34
  margelo::nitro::net::JHybridNetSocketDriverSpec::registerNatives();
34
35
  margelo::nitro::net::JFunc_void_double_std__shared_ptr_ArrayBuffer__cxx::registerNatives();
35
36
  margelo::nitro::net::JHybridNetServerDriverSpec::registerNatives();
37
+ margelo::nitro::net::JHybridHttpParserSpec::registerNatives();
36
38
  margelo::nitro::net::JHybridNetDriverSpec::registerNatives();
37
39
 
38
40
  // Register Nitro Hybrid Objects
@@ -0,0 +1,54 @@
1
+ ///
2
+ /// JHybridHttpParserSpec.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
+ #include "JHybridHttpParserSpec.hpp"
9
+
10
+
11
+
12
+ #include <string>
13
+ #include <NitroModules/ArrayBuffer.hpp>
14
+ #include <NitroModules/JArrayBuffer.hpp>
15
+
16
+ namespace margelo::nitro::net {
17
+
18
+ jni::local_ref<JHybridHttpParserSpec::jhybriddata> JHybridHttpParserSpec::initHybrid(jni::alias_ref<jhybridobject> jThis) {
19
+ return makeCxxInstance(jThis);
20
+ }
21
+
22
+ void JHybridHttpParserSpec::registerNatives() {
23
+ registerHybrid({
24
+ makeNativeMethod("initHybrid", JHybridHttpParserSpec::initHybrid),
25
+ });
26
+ }
27
+
28
+ size_t JHybridHttpParserSpec::getExternalMemorySize() noexcept {
29
+ static const auto method = javaClassStatic()->getMethod<jlong()>("getMemorySize");
30
+ return method(_javaPart);
31
+ }
32
+
33
+ void JHybridHttpParserSpec::dispose() noexcept {
34
+ static const auto method = javaClassStatic()->getMethod<void()>("dispose");
35
+ method(_javaPart);
36
+ }
37
+
38
+ std::string JHybridHttpParserSpec::toString() {
39
+ static const auto method = javaClassStatic()->getMethod<jni::JString()>("toString");
40
+ auto javaString = method(_javaPart);
41
+ return javaString->toStdString();
42
+ }
43
+
44
+ // Properties
45
+
46
+
47
+ // Methods
48
+ std::string JHybridHttpParserSpec::feed(const std::shared_ptr<ArrayBuffer>& data) {
49
+ static const auto method = javaClassStatic()->getMethod<jni::local_ref<jni::JString>(jni::alias_ref<JArrayBuffer::javaobject> /* data */)>("feed");
50
+ auto __result = method(_javaPart, JArrayBuffer::wrap(data));
51
+ return __result->toStdString();
52
+ }
53
+
54
+ } // namespace margelo::nitro::net
@@ -0,0 +1,65 @@
1
+ ///
2
+ /// HybridHttpParserSpec.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 <NitroModules/JHybridObject.hpp>
11
+ #include <fbjni/fbjni.h>
12
+ #include "HybridHttpParserSpec.hpp"
13
+
14
+
15
+
16
+
17
+ namespace margelo::nitro::net {
18
+
19
+ using namespace facebook;
20
+
21
+ class JHybridHttpParserSpec: public jni::HybridClass<JHybridHttpParserSpec, JHybridObject>,
22
+ public virtual HybridHttpParserSpec {
23
+ public:
24
+ static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/net/HybridHttpParserSpec;";
25
+ static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
26
+ static void registerNatives();
27
+
28
+ protected:
29
+ // C++ constructor (called from Java via `initHybrid()`)
30
+ explicit JHybridHttpParserSpec(jni::alias_ref<jhybridobject> jThis) :
31
+ HybridObject(HybridHttpParserSpec::TAG),
32
+ HybridBase(jThis),
33
+ _javaPart(jni::make_global(jThis)) {}
34
+
35
+ public:
36
+ ~JHybridHttpParserSpec() override {
37
+ // Hermes GC can destroy JS objects on a non-JNI Thread.
38
+ jni::ThreadScope::WithClassLoader([&] { _javaPart.reset(); });
39
+ }
40
+
41
+ public:
42
+ size_t getExternalMemorySize() noexcept override;
43
+ void dispose() noexcept override;
44
+ std::string toString() override;
45
+
46
+ public:
47
+ inline const jni::global_ref<JHybridHttpParserSpec::javaobject>& getJavaPart() const noexcept {
48
+ return _javaPart;
49
+ }
50
+
51
+ public:
52
+ // Properties
53
+
54
+
55
+ public:
56
+ // Methods
57
+ std::string feed(const std::shared_ptr<ArrayBuffer>& data) override;
58
+
59
+ private:
60
+ friend HybridBase;
61
+ using HybridBase::HybridBase;
62
+ jni::global_ref<JHybridHttpParserSpec::javaobject> _javaPart;
63
+ };
64
+
65
+ } // namespace margelo::nitro::net
@@ -11,6 +11,8 @@
11
11
  namespace margelo::nitro::net { class HybridNetSocketDriverSpec; }
12
12
  // Forward declaration of `HybridNetServerDriverSpec` to properly resolve imports.
13
13
  namespace margelo::nitro::net { class HybridNetServerDriverSpec; }
14
+ // Forward declaration of `HybridHttpParserSpec` to properly resolve imports.
15
+ namespace margelo::nitro::net { class HybridHttpParserSpec; }
14
16
  // Forward declaration of `NetConfig` to properly resolve imports.
15
17
  namespace margelo::nitro::net { struct NetConfig; }
16
18
 
@@ -19,6 +21,8 @@ namespace margelo::nitro::net { struct NetConfig; }
19
21
  #include "JHybridNetSocketDriverSpec.hpp"
20
22
  #include "HybridNetServerDriverSpec.hpp"
21
23
  #include "JHybridNetServerDriverSpec.hpp"
24
+ #include "HybridHttpParserSpec.hpp"
25
+ #include "JHybridHttpParserSpec.hpp"
22
26
  #include <NitroModules/ArrayBuffer.hpp>
23
27
  #include <optional>
24
28
  #include <NitroModules/JArrayBuffer.hpp>
@@ -68,6 +72,11 @@ namespace margelo::nitro::net {
68
72
  auto __result = method(_javaPart);
69
73
  return __result->cthis()->shared_cast<JHybridNetServerDriverSpec>();
70
74
  }
75
+ std::shared_ptr<HybridHttpParserSpec> JHybridNetDriverSpec::createHttpParser(double mode) {
76
+ static const auto method = javaClassStatic()->getMethod<jni::local_ref<JHybridHttpParserSpec::javaobject>(double /* mode */)>("createHttpParser");
77
+ auto __result = method(_javaPart, mode);
78
+ return __result->cthis()->shared_cast<JHybridHttpParserSpec>();
79
+ }
71
80
  double JHybridNetDriverSpec::createSecureContext(const std::string& cert, const std::string& key, const std::optional<std::string>& passphrase) {
72
81
  static const auto method = javaClassStatic()->getMethod<double(jni::alias_ref<jni::JString> /* cert */, jni::alias_ref<jni::JString> /* key */, jni::alias_ref<jni::JString> /* passphrase */)>("createSecureContext");
73
82
  auto __result = method(_javaPart, jni::make_jstring(cert), jni::make_jstring(key), passphrase.has_value() ? jni::make_jstring(passphrase.value()) : nullptr);
@@ -56,6 +56,7 @@ namespace margelo::nitro::net {
56
56
  // Methods
57
57
  std::shared_ptr<HybridNetSocketDriverSpec> createSocket(const std::optional<std::string>& id) override;
58
58
  std::shared_ptr<HybridNetServerDriverSpec> createServer() override;
59
+ std::shared_ptr<HybridHttpParserSpec> createHttpParser(double mode) override;
59
60
  double createSecureContext(const std::string& cert, const std::string& key, const std::optional<std::string>& passphrase) override;
60
61
  double createEmptySecureContext() override;
61
62
  void addCACertToSecureContext(double scId, const std::string& ca) override;
@@ -86,6 +86,10 @@ namespace margelo::nitro::net {
86
86
  static const auto method = javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* path */, jni::alias_ref<jni::JDouble> /* backlog */)>("listenUnix");
87
87
  method(_javaPart, jni::make_jstring(path), backlog.has_value() ? jni::JDouble::valueOf(backlog.value()) : nullptr);
88
88
  }
89
+ void JHybridNetServerDriverSpec::listenTLSUnix(const std::string& path, double secureContextId, std::optional<double> backlog) {
90
+ static const auto method = javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* path */, double /* secureContextId */, jni::alias_ref<jni::JDouble> /* backlog */)>("listenTLSUnix");
91
+ method(_javaPart, jni::make_jstring(path), secureContextId, backlog.has_value() ? jni::JDouble::valueOf(backlog.value()) : nullptr);
92
+ }
89
93
  void JHybridNetServerDriverSpec::listenHandle(double fd, std::optional<double> backlog) {
90
94
  static const auto method = javaClassStatic()->getMethod<void(double /* fd */, jni::alias_ref<jni::JDouble> /* backlog */)>("listenHandle");
91
95
  method(_javaPart, fd, backlog.has_value() ? jni::JDouble::valueOf(backlog.value()) : nullptr);
@@ -60,6 +60,7 @@ namespace margelo::nitro::net {
60
60
  void listen(double port, std::optional<double> backlog, std::optional<bool> ipv6Only, std::optional<bool> reusePort) override;
61
61
  void listenTLS(double port, double secureContextId, std::optional<double> backlog, std::optional<bool> ipv6Only, std::optional<bool> reusePort) override;
62
62
  void listenUnix(const std::string& path, std::optional<double> backlog) override;
63
+ void listenTLSUnix(const std::string& path, double secureContextId, std::optional<double> backlog) override;
63
64
  void listenHandle(double fd, std::optional<double> backlog) override;
64
65
  std::string getLocalAddress() override;
65
66
  void close() override;
@@ -175,6 +175,15 @@ namespace margelo::nitro::net {
175
175
  static const auto method = javaClassStatic()->getMethod<void()>("enableKeylog");
176
176
  method(_javaPart);
177
177
  }
178
+ void JHybridNetSocketDriverSpec::enableTrace() {
179
+ static const auto method = javaClassStatic()->getMethod<void()>("enableTrace");
180
+ method(_javaPart);
181
+ }
182
+ std::optional<std::shared_ptr<ArrayBuffer>> JHybridNetSocketDriverSpec::exportKeyingMaterial(double length, const std::string& label, const std::optional<std::shared_ptr<ArrayBuffer>>& context) {
183
+ static const auto method = javaClassStatic()->getMethod<jni::local_ref<JArrayBuffer::javaobject>(double /* length */, jni::alias_ref<jni::JString> /* label */, jni::alias_ref<JArrayBuffer::javaobject> /* context */)>("exportKeyingMaterial");
184
+ auto __result = method(_javaPart, length, jni::make_jstring(label), context.has_value() ? JArrayBuffer::wrap(context.value()) : nullptr);
185
+ return __result != nullptr ? std::make_optional(__result->cthis()->getArrayBuffer()) : std::nullopt;
186
+ }
178
187
  void JHybridNetSocketDriverSpec::setNoDelay(bool enable) {
179
188
  static const auto method = javaClassStatic()->getMethod<void(jboolean /* enable */)>("setNoDelay");
180
189
  method(_javaPart, enable);
@@ -80,6 +80,8 @@ namespace margelo::nitro::net {
80
80
  void destroy() override;
81
81
  void resetAndDestroy() override;
82
82
  void enableKeylog() override;
83
+ void enableTrace() override;
84
+ std::optional<std::shared_ptr<ArrayBuffer>> exportKeyingMaterial(double length, const std::string& label, const std::optional<std::shared_ptr<ArrayBuffer>>& context) override;
83
85
  void setNoDelay(bool enable) override;
84
86
  void setKeepAlive(bool enable, double delay) override;
85
87
  std::string getLocalAddress() override;
@@ -33,8 +33,11 @@ namespace margelo::nitro::net {
33
33
  static const auto clazz = javaClassStatic();
34
34
  static const auto fieldWorkerThreads = clazz->getField<jni::JDouble>("workerThreads");
35
35
  jni::local_ref<jni::JDouble> workerThreads = this->getFieldValue(fieldWorkerThreads);
36
+ static const auto fieldDebug = clazz->getField<jni::JBoolean>("debug");
37
+ jni::local_ref<jni::JBoolean> debug = this->getFieldValue(fieldDebug);
36
38
  return NetConfig(
37
- workerThreads != nullptr ? std::make_optional(workerThreads->value()) : std::nullopt
39
+ workerThreads != nullptr ? std::make_optional(workerThreads->value()) : std::nullopt,
40
+ debug != nullptr ? std::make_optional(static_cast<bool>(debug->value())) : std::nullopt
38
41
  );
39
42
  }
40
43
 
@@ -44,12 +47,13 @@ namespace margelo::nitro::net {
44
47
  */
45
48
  [[maybe_unused]]
46
49
  static jni::local_ref<JNetConfig::javaobject> fromCpp(const NetConfig& value) {
47
- using JSignature = JNetConfig(jni::alias_ref<jni::JDouble>);
50
+ using JSignature = JNetConfig(jni::alias_ref<jni::JDouble>, jni::alias_ref<jni::JBoolean>);
48
51
  static const auto clazz = javaClassStatic();
49
52
  static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
50
53
  return create(
51
54
  clazz,
52
- value.workerThreads.has_value() ? jni::JDouble::valueOf(value.workerThreads.value()) : nullptr
55
+ value.workerThreads.has_value() ? jni::JDouble::valueOf(value.workerThreads.value()) : nullptr,
56
+ value.debug.has_value() ? jni::JBoolean::valueOf(value.debug.value()) : nullptr
53
57
  );
54
58
  }
55
59
  };
@@ -0,0 +1,58 @@
1
+ ///
2
+ /// HybridHttpParserSpec.kt
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
+ package com.margelo.nitro.net
9
+
10
+ import androidx.annotation.Keep
11
+ import com.facebook.jni.HybridData
12
+ import com.facebook.proguard.annotations.DoNotStrip
13
+ import com.margelo.nitro.core.ArrayBuffer
14
+ import com.margelo.nitro.core.HybridObject
15
+
16
+ /**
17
+ * A Kotlin class representing the HttpParser HybridObject.
18
+ * Implement this abstract class to create Kotlin-based instances of HttpParser.
19
+ */
20
+ @DoNotStrip
21
+ @Keep
22
+ @Suppress(
23
+ "KotlinJniMissingFunction", "unused",
24
+ "RedundantSuppression", "RedundantUnitReturnType", "SimpleRedundantLet",
25
+ "LocalVariableName", "PropertyName", "PrivatePropertyName", "FunctionName"
26
+ )
27
+ abstract class HybridHttpParserSpec: HybridObject() {
28
+ @DoNotStrip
29
+ private var mHybridData: HybridData = initHybrid()
30
+
31
+ init {
32
+ super.updateNative(mHybridData)
33
+ }
34
+
35
+ override fun updateNative(hybridData: HybridData) {
36
+ mHybridData = hybridData
37
+ super.updateNative(hybridData)
38
+ }
39
+
40
+ // Default implementation of `HybridObject.toString()`
41
+ override fun toString(): String {
42
+ return "[HybridObject HttpParser]"
43
+ }
44
+
45
+ // Properties
46
+
47
+
48
+ // Methods
49
+ @DoNotStrip
50
+ @Keep
51
+ abstract fun feed(data: ArrayBuffer): String
52
+
53
+ private external fun initHybrid(): HybridData
54
+
55
+ companion object {
56
+ protected const val TAG = "HybridHttpParserSpec"
57
+ }
58
+ }
@@ -54,6 +54,10 @@ abstract class HybridNetDriverSpec: HybridObject() {
54
54
  @Keep
55
55
  abstract fun createServer(): HybridNetServerDriverSpec
56
56
 
57
+ @DoNotStrip
58
+ @Keep
59
+ abstract fun createHttpParser(mode: Double): HybridHttpParserSpec
60
+
57
61
  @DoNotStrip
58
62
  @Keep
59
63
  abstract fun createSecureContext(cert: String, key: String, passphrase: String?): Double
@@ -76,6 +76,10 @@ abstract class HybridNetServerDriverSpec: HybridObject() {
76
76
  @Keep
77
77
  abstract fun listenUnix(path: String, backlog: Double?): Unit
78
78
 
79
+ @DoNotStrip
80
+ @Keep
81
+ abstract fun listenTLSUnix(path: String, secureContextId: Double, backlog: Double?): Unit
82
+
79
83
  @DoNotStrip
80
84
  @Keep
81
85
  abstract fun listenHandle(fd: Double, backlog: Double?): Unit
@@ -158,6 +158,14 @@ abstract class HybridNetSocketDriverSpec: HybridObject() {
158
158
  @Keep
159
159
  abstract fun enableKeylog(): Unit
160
160
 
161
+ @DoNotStrip
162
+ @Keep
163
+ abstract fun enableTrace(): Unit
164
+
165
+ @DoNotStrip
166
+ @Keep
167
+ abstract fun exportKeyingMaterial(length: Double, label: String, context: ArrayBuffer?): ArrayBuffer?
168
+
161
169
  @DoNotStrip
162
170
  @Keep
163
171
  abstract fun setNoDelay(enable: Boolean): Unit
@@ -19,7 +19,10 @@ import com.facebook.proguard.annotations.DoNotStrip
19
19
  data class NetConfig(
20
20
  @DoNotStrip
21
21
  @Keep
22
- val workerThreads: Double?
22
+ val workerThreads: Double?,
23
+ @DoNotStrip
24
+ @Keep
25
+ val debug: Boolean?
23
26
  ) {
24
27
  /* primary constructor */
25
28
 
@@ -31,8 +34,8 @@ data class NetConfig(
31
34
  @Keep
32
35
  @Suppress("unused")
33
36
  @JvmStatic
34
- private fun fromCpp(workerThreads: Double?): NetConfig {
35
- return NetConfig(workerThreads)
37
+ private fun fromCpp(workerThreads: Double?, debug: Boolean?): NetConfig {
38
+ return NetConfig(workerThreads, debug)
36
39
  }
37
40
  }
38
41
  }
@@ -8,6 +8,7 @@
8
8
  #include "RustCNet-Swift-Cxx-Bridge.hpp"
9
9
 
10
10
  // Include C++ implementation defined types
11
+ #include "HybridHttpParserSpecSwift.hpp"
11
12
  #include "HybridNetDriverSpecSwift.hpp"
12
13
  #include "HybridNetServerDriverSpecSwift.hpp"
13
14
  #include "HybridNetSocketDriverSpecSwift.hpp"
@@ -56,6 +57,22 @@ namespace margelo::nitro::net::bridge::swift {
56
57
  return swiftPart.toUnsafe();
57
58
  }
58
59
 
60
+ // pragma MARK: std::shared_ptr<HybridHttpParserSpec>
61
+ std::shared_ptr<HybridHttpParserSpec> create_std__shared_ptr_HybridHttpParserSpec_(void* NON_NULL swiftUnsafePointer) noexcept {
62
+ RustCNet::HybridHttpParserSpec_cxx swiftPart = RustCNet::HybridHttpParserSpec_cxx::fromUnsafe(swiftUnsafePointer);
63
+ return std::make_shared<margelo::nitro::net::HybridHttpParserSpecSwift>(swiftPart);
64
+ }
65
+ void* NON_NULL get_std__shared_ptr_HybridHttpParserSpec_(std__shared_ptr_HybridHttpParserSpec_ cppType) {
66
+ std::shared_ptr<margelo::nitro::net::HybridHttpParserSpecSwift> swiftWrapper = std::dynamic_pointer_cast<margelo::nitro::net::HybridHttpParserSpecSwift>(cppType);
67
+ #ifdef NITRO_DEBUG
68
+ if (swiftWrapper == nullptr) [[unlikely]] {
69
+ throw std::runtime_error("Class \"HybridHttpParserSpec\" is not implemented in Swift!");
70
+ }
71
+ #endif
72
+ RustCNet::HybridHttpParserSpec_cxx& swiftPart = swiftWrapper->getSwiftPart();
73
+ return swiftPart.toUnsafe();
74
+ }
75
+
59
76
  // pragma MARK: std::shared_ptr<HybridNetDriverSpec>
60
77
  std::shared_ptr<HybridNetDriverSpec> create_std__shared_ptr_HybridNetDriverSpec_(void* NON_NULL swiftUnsafePointer) noexcept {
61
78
  RustCNet::HybridNetDriverSpec_cxx swiftPart = RustCNet::HybridNetDriverSpec_cxx::fromUnsafe(swiftUnsafePointer);
@@ -10,6 +10,8 @@
10
10
  // Forward declarations of C++ defined types
11
11
  // Forward declaration of `ArrayBufferHolder` to properly resolve imports.
12
12
  namespace NitroModules { class ArrayBufferHolder; }
13
+ // Forward declaration of `HybridHttpParserSpec` to properly resolve imports.
14
+ namespace margelo::nitro::net { class HybridHttpParserSpec; }
13
15
  // Forward declaration of `HybridNetDriverSpec` to properly resolve imports.
14
16
  namespace margelo::nitro::net { class HybridNetDriverSpec; }
15
17
  // Forward declaration of `HybridNetServerDriverSpec` to properly resolve imports.
@@ -18,6 +20,8 @@ namespace margelo::nitro::net { class HybridNetServerDriverSpec; }
18
20
  namespace margelo::nitro::net { class HybridNetSocketDriverSpec; }
19
21
 
20
22
  // Forward declarations of Swift defined types
23
+ // Forward declaration of `HybridHttpParserSpec_cxx` to properly resolve imports.
24
+ namespace RustCNet { class HybridHttpParserSpec_cxx; }
21
25
  // Forward declaration of `HybridNetDriverSpec_cxx` to properly resolve imports.
22
26
  namespace RustCNet { class HybridNetDriverSpec_cxx; }
23
27
  // Forward declaration of `HybridNetServerDriverSpec_cxx` to properly resolve imports.
@@ -26,6 +30,7 @@ namespace RustCNet { class HybridNetServerDriverSpec_cxx; }
26
30
  namespace RustCNet { class HybridNetSocketDriverSpec_cxx; }
27
31
 
28
32
  // Include C++ defined types
33
+ #include "HybridHttpParserSpec.hpp"
29
34
  #include "HybridNetDriverSpec.hpp"
30
35
  #include "HybridNetServerDriverSpec.hpp"
31
36
  #include "HybridNetSocketDriverSpec.hpp"
@@ -195,6 +200,18 @@ namespace margelo::nitro::net::bridge::swift {
195
200
  using std__weak_ptr_HybridNetServerDriverSpec_ = std::weak_ptr<HybridNetServerDriverSpec>;
196
201
  inline std__weak_ptr_HybridNetServerDriverSpec_ weakify_std__shared_ptr_HybridNetServerDriverSpec_(const std::shared_ptr<HybridNetServerDriverSpec>& strong) noexcept { return strong; }
197
202
 
203
+ // pragma MARK: std::shared_ptr<HybridHttpParserSpec>
204
+ /**
205
+ * Specialized version of `std::shared_ptr<HybridHttpParserSpec>`.
206
+ */
207
+ using std__shared_ptr_HybridHttpParserSpec_ = std::shared_ptr<HybridHttpParserSpec>;
208
+ std::shared_ptr<HybridHttpParserSpec> create_std__shared_ptr_HybridHttpParserSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
209
+ void* NON_NULL get_std__shared_ptr_HybridHttpParserSpec_(std__shared_ptr_HybridHttpParserSpec_ cppType);
210
+
211
+ // pragma MARK: std::weak_ptr<HybridHttpParserSpec>
212
+ using std__weak_ptr_HybridHttpParserSpec_ = std::weak_ptr<HybridHttpParserSpec>;
213
+ inline std__weak_ptr_HybridHttpParserSpec_ weakify_std__shared_ptr_HybridHttpParserSpec_(const std::shared_ptr<HybridHttpParserSpec>& strong) noexcept { return strong; }
214
+
198
215
  // pragma MARK: std::shared_ptr<HybridNetDriverSpec>
199
216
  /**
200
217
  * Specialized version of `std::shared_ptr<HybridNetDriverSpec>`.
@@ -225,6 +242,15 @@ namespace margelo::nitro::net::bridge::swift {
225
242
  return Result<std::shared_ptr<HybridNetServerDriverSpec>>::withError(error);
226
243
  }
227
244
 
245
+ // pragma MARK: Result<std::shared_ptr<HybridHttpParserSpec>>
246
+ using Result_std__shared_ptr_HybridHttpParserSpec__ = Result<std::shared_ptr<HybridHttpParserSpec>>;
247
+ inline Result_std__shared_ptr_HybridHttpParserSpec__ create_Result_std__shared_ptr_HybridHttpParserSpec__(const std::shared_ptr<HybridHttpParserSpec>& value) noexcept {
248
+ return Result<std::shared_ptr<HybridHttpParserSpec>>::withValue(value);
249
+ }
250
+ inline Result_std__shared_ptr_HybridHttpParserSpec__ create_Result_std__shared_ptr_HybridHttpParserSpec__(const std::exception_ptr& error) noexcept {
251
+ return Result<std::shared_ptr<HybridHttpParserSpec>>::withError(error);
252
+ }
253
+
228
254
  // pragma MARK: Result<double>
229
255
  using Result_double_ = Result<double>;
230
256
  inline Result_double_ create_Result_double_(double value) noexcept {
@@ -8,6 +8,8 @@
8
8
  #pragma once
9
9
 
10
10
  // Forward declarations of C++ defined types
11
+ // Forward declaration of `HybridHttpParserSpec` to properly resolve imports.
12
+ namespace margelo::nitro::net { class HybridHttpParserSpec; }
11
13
  // Forward declaration of `HybridNetDriverSpec` to properly resolve imports.
12
14
  namespace margelo::nitro::net { class HybridNetDriverSpec; }
13
15
  // Forward declaration of `HybridNetServerDriverSpec` to properly resolve imports.
@@ -18,6 +20,7 @@ namespace margelo::nitro::net { class HybridNetSocketDriverSpec; }
18
20
  namespace margelo::nitro::net { struct NetConfig; }
19
21
 
20
22
  // Include C++ defined types
23
+ #include "HybridHttpParserSpec.hpp"
21
24
  #include "HybridNetDriverSpec.hpp"
22
25
  #include "HybridNetServerDriverSpec.hpp"
23
26
  #include "HybridNetSocketDriverSpec.hpp"
@@ -40,6 +43,8 @@ namespace margelo::nitro::net { struct NetConfig; }
40
43
  #include <NitroModules/DateToChronoDate.hpp>
41
44
 
42
45
  // Forward declarations of Swift defined types
46
+ // Forward declaration of `HybridHttpParserSpec_cxx` to properly resolve imports.
47
+ namespace RustCNet { class HybridHttpParserSpec_cxx; }
43
48
  // Forward declaration of `HybridNetDriverSpec_cxx` to properly resolve imports.
44
49
  namespace RustCNet { class HybridNetDriverSpec_cxx; }
45
50
  // Forward declaration of `HybridNetServerDriverSpec_cxx` to properly resolve imports.
@@ -0,0 +1,11 @@
1
+ ///
2
+ /// HybridHttpParserSpecSwift.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
+ #include "HybridHttpParserSpecSwift.hpp"
9
+
10
+ namespace margelo::nitro::net {
11
+ } // namespace margelo::nitro::net