react-native-nitro-net 0.2.0 → 0.3.1

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 (83) 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/Driver.d.ts +1 -0
  15. package/lib/Driver.d.ts.map +1 -0
  16. package/lib/Driver.js +2 -5
  17. package/lib/Net.nitro.d.ts +20 -0
  18. package/lib/Net.nitro.d.ts.map +1 -0
  19. package/lib/Net.nitro.js +4 -7
  20. package/lib/http.d.ts +204 -0
  21. package/lib/http.d.ts.map +1 -0
  22. package/lib/http.js +1126 -0
  23. package/lib/https.d.ts +25 -0
  24. package/lib/https.d.ts.map +1 -0
  25. package/lib/https.js +102 -0
  26. package/lib/index.d.ts +41 -160
  27. package/lib/index.d.ts.map +1 -0
  28. package/lib/index.js +11 -821
  29. package/lib/net.d.ts +197 -0
  30. package/lib/net.d.ts.map +1 -0
  31. package/lib/net.js +875 -0
  32. package/lib/tls.d.ts +23 -1
  33. package/lib/tls.d.ts.map +1 -0
  34. package/lib/tls.js +108 -54
  35. package/nitrogen/generated/android/RustCNet+autolinking.cmake +2 -0
  36. package/nitrogen/generated/android/RustCNetOnLoad.cpp +2 -0
  37. package/nitrogen/generated/android/c++/JHybridHttpParserSpec.cpp +54 -0
  38. package/nitrogen/generated/android/c++/JHybridHttpParserSpec.hpp +65 -0
  39. package/nitrogen/generated/android/c++/JHybridNetDriverSpec.cpp +9 -0
  40. package/nitrogen/generated/android/c++/JHybridNetDriverSpec.hpp +1 -0
  41. package/nitrogen/generated/android/c++/JHybridNetServerDriverSpec.cpp +4 -0
  42. package/nitrogen/generated/android/c++/JHybridNetServerDriverSpec.hpp +1 -0
  43. package/nitrogen/generated/android/c++/JHybridNetSocketDriverSpec.cpp +9 -0
  44. package/nitrogen/generated/android/c++/JHybridNetSocketDriverSpec.hpp +2 -0
  45. package/nitrogen/generated/android/c++/JNetConfig.hpp +7 -3
  46. package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridHttpParserSpec.kt +58 -0
  47. package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridNetDriverSpec.kt +4 -0
  48. package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridNetServerDriverSpec.kt +4 -0
  49. package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridNetSocketDriverSpec.kt +8 -0
  50. package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/NetConfig.kt +6 -3
  51. package/nitrogen/generated/ios/RustCNet-Swift-Cxx-Bridge.cpp +17 -0
  52. package/nitrogen/generated/ios/RustCNet-Swift-Cxx-Bridge.hpp +26 -0
  53. package/nitrogen/generated/ios/RustCNet-Swift-Cxx-Umbrella.hpp +5 -0
  54. package/nitrogen/generated/ios/c++/HybridHttpParserSpecSwift.cpp +11 -0
  55. package/nitrogen/generated/ios/c++/HybridHttpParserSpecSwift.hpp +79 -0
  56. package/nitrogen/generated/ios/c++/HybridNetDriverSpecSwift.hpp +11 -0
  57. package/nitrogen/generated/ios/c++/HybridNetServerDriverSpecSwift.hpp +6 -0
  58. package/nitrogen/generated/ios/c++/HybridNetSocketDriverSpecSwift.hpp +14 -0
  59. package/nitrogen/generated/ios/swift/HybridHttpParserSpec.swift +56 -0
  60. package/nitrogen/generated/ios/swift/HybridHttpParserSpec_cxx.swift +131 -0
  61. package/nitrogen/generated/ios/swift/HybridNetDriverSpec.swift +1 -0
  62. package/nitrogen/generated/ios/swift/HybridNetDriverSpec_cxx.swift +15 -0
  63. package/nitrogen/generated/ios/swift/HybridNetServerDriverSpec.swift +1 -0
  64. package/nitrogen/generated/ios/swift/HybridNetServerDriverSpec_cxx.swift +11 -0
  65. package/nitrogen/generated/ios/swift/HybridNetSocketDriverSpec.swift +2 -0
  66. package/nitrogen/generated/ios/swift/HybridNetSocketDriverSpec_cxx.swift +36 -0
  67. package/nitrogen/generated/ios/swift/NetConfig.swift +19 -1
  68. package/nitrogen/generated/shared/c++/HybridHttpParserSpec.cpp +21 -0
  69. package/nitrogen/generated/shared/c++/HybridHttpParserSpec.hpp +63 -0
  70. package/nitrogen/generated/shared/c++/HybridNetDriverSpec.cpp +1 -0
  71. package/nitrogen/generated/shared/c++/HybridNetDriverSpec.hpp +4 -0
  72. package/nitrogen/generated/shared/c++/HybridNetServerDriverSpec.cpp +1 -0
  73. package/nitrogen/generated/shared/c++/HybridNetServerDriverSpec.hpp +1 -0
  74. package/nitrogen/generated/shared/c++/HybridNetSocketDriverSpec.cpp +2 -0
  75. package/nitrogen/generated/shared/c++/HybridNetSocketDriverSpec.hpp +2 -0
  76. package/nitrogen/generated/shared/c++/NetConfig.hpp +6 -2
  77. package/package.json +9 -7
  78. package/src/Net.nitro.ts +17 -0
  79. package/src/http.ts +1303 -0
  80. package/src/https.ts +125 -0
  81. package/src/index.ts +13 -874
  82. package/src/net.ts +1005 -0
  83. package/src/tls.ts +82 -6
package/lib/tls.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Socket, Server as NetServer, SocketOptions } from './index';
1
+ import { Socket, Server as NetServer, SocketOptions } from './net';
2
2
  export interface PeerCertificate {
3
3
  subject: {
4
4
  [key: string]: string;
@@ -26,6 +26,13 @@ export interface ConnectionOptions extends SocketOptions {
26
26
  pfx?: string | ArrayBuffer;
27
27
  passphrase?: string;
28
28
  keylog?: boolean;
29
+ /**
30
+ * Custom hostname verification function.
31
+ * If provided, it will be called after the TLS handshake to verify the peer certificate.
32
+ * Return `undefined` if valid, or an `Error` if invalid.
33
+ * If not provided, the default `checkServerIdentity` is used.
34
+ */
35
+ checkServerIdentity?: (hostname: string, cert: PeerCertificate) => Error | undefined;
29
36
  }
30
37
  export interface SecureContextOptions {
31
38
  pfx?: string | ArrayBuffer;
@@ -70,6 +77,20 @@ export declare class TLSSocket extends Socket {
70
77
  getSharedSigalgs(): string | undefined;
71
78
  renegotiate(options: any, callback: (err: Error | null) => void): boolean;
72
79
  disableRenegotiation(): void;
80
+ /**
81
+ * Enables trace output for this socket.
82
+ */
83
+ enableTrace(): void;
84
+ /**
85
+ * Exports keying material for use by external protocols.
86
+ *
87
+ * @param length The number of bytes to return.
88
+ * @param label A label identifying the keying material.
89
+ * @param context An optional context.
90
+ * @returns Buffer containing keying material.
91
+ * @throws Error if export fails (e.g., TLS not connected).
92
+ */
93
+ exportKeyingMaterial(length: number, label: string, context?: Buffer): Buffer;
73
94
  constructor(socket: Socket, options?: ConnectionOptions);
74
95
  constructor(options: ConnectionOptions);
75
96
  connect(options: any, connectionListener?: () => void): this;
@@ -122,3 +143,4 @@ export declare function parseCertString(certString: string): {
122
143
  * Mock implementation of convertTLSV1CertToPEM.
123
144
  */
124
145
  export declare function convertTLSV1CertToPEM(cert: string | Buffer): string;
146
+ //# sourceMappingURL=tls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tls.d.ts","sourceRoot":"","sources":["../src/tls.ts"],"names":[],"mappings":"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"}
package/lib/tls.js CHANGED
@@ -1,65 +1,59 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SecurePair = exports.CryptoStream = exports.Server = exports.TLSSocket = exports.SecureContext = exports.SLAB_BUFFER_SIZE = exports.DEFAULT_ECDH_CURVE = exports.rootCertificates = exports.DEFAULT_MAX_VERSION = exports.DEFAULT_MIN_VERSION = void 0;
4
- exports.createSecureContext = createSecureContext;
5
- exports.connect = connect;
6
- exports.createServer = createServer;
7
- exports.getCiphers = getCiphers;
8
- exports.checkServerIdentity = checkServerIdentity;
9
- exports.createSecurePair = createSecurePair;
10
- exports.parseCertString = parseCertString;
11
- exports.convertTLSV1CertToPEM = convertTLSV1CertToPEM;
12
- const index_1 = require("./index");
13
- const Driver_1 = require("./Driver");
14
- exports.DEFAULT_MIN_VERSION = 'TLSv1.2';
15
- exports.DEFAULT_MAX_VERSION = 'TLSv1.3';
16
- exports.rootCertificates = [];
17
- exports.DEFAULT_ECDH_CURVE = 'auto'; // Managed by rustls
18
- exports.SLAB_BUFFER_SIZE = 10 * 1024 * 1024; // 10MB default
19
- class SecureContext {
1
+ import { Socket, Server as NetServer, isVerbose } from './net';
2
+ import { Driver } from './Driver';
3
+ function debugLog(message) {
4
+ if (isVerbose()) {
5
+ const timestamp = new Date().toISOString().split('T')[1].split('Z')[0];
6
+ console.log(`[NET DEBUG ${timestamp}] ${message}`);
7
+ }
8
+ }
9
+ export const DEFAULT_MIN_VERSION = 'TLSv1.2';
10
+ export const DEFAULT_MAX_VERSION = 'TLSv1.3';
11
+ export const rootCertificates = [];
12
+ export const DEFAULT_ECDH_CURVE = 'auto'; // Managed by rustls
13
+ export const SLAB_BUFFER_SIZE = 10 * 1024 * 1024; // 10MB default
14
+ export class SecureContext {
20
15
  constructor(options) {
21
16
  if (options && options.pfx) {
22
- this._id = Driver_1.Driver.createEmptySecureContext();
17
+ this._id = Driver.createEmptySecureContext();
23
18
  const pfx = typeof options.pfx === 'string' ? Buffer.from(options.pfx).buffer : options.pfx;
24
- Driver_1.Driver.setPFXToSecureContext(this._id, pfx, options.passphrase);
19
+ Driver.setPFXToSecureContext(this._id, pfx, options.passphrase);
25
20
  }
26
21
  else if (options && options.cert && options.key) {
27
22
  const cert = Array.isArray(options.cert) ? options.cert[0] : options.cert;
28
23
  const key = Array.isArray(options.key) ? options.key[0] : options.key;
29
- this._id = Driver_1.Driver.createSecureContext(cert, key, options.passphrase);
24
+ this._id = Driver.createSecureContext(cert, key, options.passphrase);
30
25
  }
31
26
  else {
32
- this._id = Driver_1.Driver.createEmptySecureContext();
27
+ this._id = Driver.createEmptySecureContext();
33
28
  }
34
29
  if (options && options.ca) {
35
30
  const cas = Array.isArray(options.ca) ? options.ca : [options.ca];
36
31
  for (const ca of cas) {
37
- Driver_1.Driver.addCACertToSecureContext(this._id, ca);
32
+ Driver.addCACertToSecureContext(this._id, ca);
38
33
  }
39
34
  }
40
35
  }
41
36
  setOCSPResponse(ocsp) {
42
- Driver_1.Driver.setOCSPResponseToSecureContext(this._id, ocsp);
37
+ Driver.setOCSPResponseToSecureContext(this._id, ocsp);
43
38
  }
44
39
  getTicketKeys() {
45
- return Driver_1.Driver.getTicketKeys(this._id);
40
+ return Driver.getTicketKeys(this._id);
46
41
  }
47
42
  setTicketKeys(keys) {
48
- Driver_1.Driver.setTicketKeys(this._id, keys);
43
+ Driver.setTicketKeys(this._id, keys);
49
44
  }
50
45
  get id() {
51
46
  return this._id;
52
47
  }
53
48
  // Node.js doesn't have these on SecureContext but we might need them
54
49
  addCACert(ca) {
55
- Driver_1.Driver.addCACertToSecureContext(this._id, ca);
50
+ Driver.addCACertToSecureContext(this._id, ca);
56
51
  }
57
52
  }
58
- exports.SecureContext = SecureContext;
59
- function createSecureContext(options) {
53
+ export function createSecureContext(options) {
60
54
  return new SecureContext(options);
61
55
  }
62
- class TLSSocket extends index_1.Socket {
56
+ export class TLSSocket extends Socket {
63
57
  get encrypted() {
64
58
  return true;
65
59
  }
@@ -131,23 +125,58 @@ class TLSSocket extends index_1.Socket {
131
125
  }
132
126
  renegotiate(options, callback) {
133
127
  if (callback) {
134
- process.nextTick(() => callback(new Error('Renegotiation is not supported by rustls')));
128
+ setTimeout(() => {
129
+ const err = new Error('Renegotiation is not supported by rustls');
130
+ err.code = 'ERR_TLS_RENEGOTIATION_DISABLED';
131
+ callback(err);
132
+ }, 0);
135
133
  }
136
134
  return false;
137
135
  }
138
136
  disableRenegotiation() {
139
137
  // No-op, already effectively disabled
140
138
  }
139
+ /**
140
+ * Enables trace output for this socket.
141
+ */
142
+ enableTrace() {
143
+ const driver = this._driver;
144
+ if (driver) {
145
+ driver.enableTrace();
146
+ }
147
+ }
148
+ /**
149
+ * Exports keying material for use by external protocols.
150
+ *
151
+ * @param length The number of bytes to return.
152
+ * @param label A label identifying the keying material.
153
+ * @param context An optional context.
154
+ * @returns Buffer containing keying material.
155
+ * @throws Error if export fails (e.g., TLS not connected).
156
+ */
157
+ exportKeyingMaterial(length, label, context) {
158
+ const driver = this._driver;
159
+ if (driver) {
160
+ const ctx = context ? new Uint8Array(context).buffer : undefined;
161
+ const result = driver.exportKeyingMaterial(length, label, ctx);
162
+ if (result) {
163
+ return Buffer.from(result);
164
+ }
165
+ }
166
+ const err = new Error('exportKeyingMaterial failed: TLS connection may not be established');
167
+ err.code = 'ERR_TLS_EXPORT_KEYING_MATERIAL';
168
+ throw err;
169
+ }
141
170
  constructor(socketOrOptions, options) {
142
171
  let opts = {};
143
- if (socketOrOptions instanceof index_1.Socket) {
172
+ if (socketOrOptions instanceof Socket) {
144
173
  opts = { ...options, socketDriver: socketOrOptions._driver };
145
174
  }
146
175
  else {
147
176
  opts = socketOrOptions || {};
148
177
  }
149
178
  super(opts);
150
- if (socketOrOptions instanceof index_1.Socket) {
179
+ if (socketOrOptions instanceof Socket) {
151
180
  this._servername = socketOrOptions._servername;
152
181
  }
153
182
  this.on('event', (event, data) => {
@@ -174,6 +203,21 @@ class TLSSocket extends index_1.Socket {
174
203
  if (connectionListener)
175
204
  this.once('secureConnect', connectionListener);
176
205
  this.once('connect', () => {
206
+ // After the native TLS handshake, perform hostname verification
207
+ if (rejectUnauthorized !== false) {
208
+ const cert = this.getPeerCertificate();
209
+ if (cert && Object.keys(cert).length > 0) {
210
+ const verifyFn = (typeof options === 'object' && options.checkServerIdentity)
211
+ ? options.checkServerIdentity
212
+ : checkServerIdentity;
213
+ const verifyErr = verifyFn(servername, cert);
214
+ if (verifyErr) {
215
+ this.emit('error', verifyErr);
216
+ this.destroy(verifyErr);
217
+ return;
218
+ }
219
+ }
220
+ }
177
221
  this.emit('secureConnect');
178
222
  });
179
223
  if (session) {
@@ -194,17 +238,21 @@ class TLSSocket extends index_1.Socket {
194
238
  }
195
239
  if (path) {
196
240
  if (secureContextId !== undefined) {
241
+ debugLog(`TLSSocket.connect: Calling driver.connectUnixTLSWithContext(${path}, ${servername}, ctx=${secureContextId})`);
197
242
  driver.connectUnixTLSWithContext(path, servername, rejectUnauthorized, secureContextId);
198
243
  }
199
244
  else {
245
+ debugLog(`TLSSocket.connect: Calling driver.connectUnixTLS(${path}, ${servername})`);
200
246
  driver.connectUnixTLS(path, servername, rejectUnauthorized);
201
247
  }
202
248
  }
203
249
  else {
204
250
  if (secureContextId !== undefined) {
251
+ debugLog(`TLSSocket.connect: Calling driver.connectTLSWithContext(${host}, ${port}, ${servername}, ctx=${secureContextId})`);
205
252
  driver.connectTLSWithContext(host, port, servername, rejectUnauthorized, secureContextId);
206
253
  }
207
254
  else {
255
+ debugLog(`TLSSocket.connect: Calling driver.connectTLS(${host}, ${port}, ${servername})`);
208
256
  driver.connectTLS(host, port, servername, rejectUnauthorized);
209
257
  }
210
258
  }
@@ -212,8 +260,7 @@ class TLSSocket extends index_1.Socket {
212
260
  return this;
213
261
  }
214
262
  }
215
- exports.TLSSocket = TLSSocket;
216
- function connect(...args) {
263
+ export function connect(...args) {
217
264
  let port;
218
265
  let host = 'localhost';
219
266
  let options = {};
@@ -247,7 +294,7 @@ function connect(...args) {
247
294
  }, listener);
248
295
  return socket;
249
296
  }
250
- class Server extends index_1.Server {
297
+ export class Server extends NetServer {
251
298
  constructor(options, connectionListener) {
252
299
  super(options);
253
300
  this._secureContextId = 0;
@@ -261,6 +308,10 @@ class Server extends index_1.Server {
261
308
  ca: options.ca
262
309
  }).id;
263
310
  }
311
+ else {
312
+ // Create empty secure context to allow late configuration (addContext)
313
+ this._secureContextId = createSecureContext().id;
314
+ }
264
315
  this.on('connection', (socket) => {
265
316
  const tlsSocket = new TLSSocket(socket);
266
317
  this.emit('secureConnection', tlsSocket);
@@ -279,18 +330,18 @@ class Server extends index_1.Server {
279
330
  if (!this._secureContextId) {
280
331
  throw new Error("Cannot addContext to a non-TLS server. Provide initial cert/key in constructor.");
281
332
  }
282
- Driver_1.Driver.addContextToSecureContext(this._secureContextId, hostname, context.cert, context.key);
333
+ Driver.addContextToSecureContext(this._secureContextId, hostname, context.cert, context.key);
283
334
  }
284
335
  setSecureContext(options) {
285
336
  this._secureContextId = createSecureContext(options).id;
286
337
  }
287
338
  getTicketKeys() {
288
- return this._secureContextId ? Driver_1.Driver.getTicketKeys(this._secureContextId) : undefined;
339
+ return this._secureContextId ? Driver.getTicketKeys(this._secureContextId) : undefined;
289
340
  }
290
341
  setTicketKeys(keys) {
291
342
  if (!this._secureContextId)
292
343
  throw new Error("Not a TLS server");
293
- Driver_1.Driver.setTicketKeys(this._secureContextId, keys);
344
+ Driver.setTicketKeys(this._secureContextId, keys);
294
345
  }
295
346
  listen(port, host, backlog, callback) {
296
347
  if (!this._secureContextId) {
@@ -338,18 +389,23 @@ class Server extends index_1.Server {
338
389
  if (_callback)
339
390
  this.once('listening', _callback);
340
391
  const driver = this._driver;
341
- if (handle || _path) {
342
- console.warn("TLS over Unix sockets/handles not fully implemented yet");
392
+ if (_path) {
393
+ driver.listenTLSUnix(_path, this._secureContextId, _backlog);
394
+ }
395
+ else if (handle) {
396
+ console.warn("TLS over handles not fully implemented yet");
397
+ driver.listenTLS(_port || 0, this._secureContextId, _backlog, ipv6Only, reusePort);
398
+ }
399
+ else {
400
+ driver.listenTLS(_port || 0, this._secureContextId, _backlog, ipv6Only, reusePort);
343
401
  }
344
- driver.listenTLS(_port || 0, this._secureContextId, _backlog, ipv6Only, reusePort);
345
402
  return this;
346
403
  }
347
404
  }
348
- exports.Server = Server;
349
- function createServer(options, connectionListener) {
405
+ export function createServer(options, connectionListener) {
350
406
  return new Server(options, connectionListener);
351
407
  }
352
- function getCiphers() {
408
+ export function getCiphers() {
353
409
  return [
354
410
  'TLS_AES_128_GCM_SHA256',
355
411
  'TLS_AES_256_GCM_SHA384',
@@ -362,7 +418,7 @@ function getCiphers() {
362
418
  'TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256'
363
419
  ];
364
420
  }
365
- function checkServerIdentity(hostname, cert) {
421
+ export function checkServerIdentity(hostname, cert) {
366
422
  const subject = cert.subject;
367
423
  const dnsNames = [];
368
424
  // In a real implementation we'd extract SANs from the cert object if available.
@@ -408,29 +464,27 @@ function checkServerIdentity(hostname, cert) {
408
464
  * Legacy CryptoStream for Node.js compatibility.
409
465
  * In this implementation, it's a simple wrapper around TLSSocket.
410
466
  */
411
- class CryptoStream extends TLSSocket {
467
+ export class CryptoStream extends TLSSocket {
412
468
  constructor(options) {
413
469
  super(options || {});
414
470
  }
415
471
  }
416
- exports.CryptoStream = CryptoStream;
417
472
  /**
418
473
  * Legacy SecurePair for Node.js compatibility.
419
474
  */
420
- class SecurePair {
475
+ export class SecurePair {
421
476
  constructor(secureContext, isServer, requestCert, rejectUnauthorized) {
422
477
  this.cleartext = new CryptoStream();
423
478
  this.encrypted = this.cleartext; // Logically the same in our simplified model
424
479
  }
425
480
  }
426
- exports.SecurePair = SecurePair;
427
- function createSecurePair(secureContext, isServer, requestCert, rejectUnauthorized) {
481
+ export function createSecurePair(secureContext, isServer, requestCert, rejectUnauthorized) {
428
482
  return new SecurePair(secureContext, isServer, requestCert, rejectUnauthorized);
429
483
  }
430
484
  /**
431
485
  * Legacy certificate string parser.
432
486
  */
433
- function parseCertString(certString) {
487
+ export function parseCertString(certString) {
434
488
  const out = {};
435
489
  const parts = certString.split('/');
436
490
  for (const part of parts) {
@@ -443,7 +497,7 @@ function parseCertString(certString) {
443
497
  /**
444
498
  * Mock implementation of convertTLSV1CertToPEM.
445
499
  */
446
- function convertTLSV1CertToPEM(cert) {
500
+ export function convertTLSV1CertToPEM(cert) {
447
501
  if (typeof cert === 'string' && cert.includes('BEGIN CERTIFICATE'))
448
502
  return cert;
449
503
  const body = (cert instanceof Buffer) ? cert.toString('base64') : Buffer.from(cert).toString('base64');
@@ -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
  };