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/src/tls.ts CHANGED
@@ -1,7 +1,14 @@
1
- import { Socket, Server as NetServer, SocketOptions } from './index'
1
+ import { Socket, Server as NetServer, SocketOptions, isVerbose } from './net'
2
2
  import { Driver } from './Driver'
3
3
  import { NetSocketDriver } from './Net.nitro'
4
4
 
5
+ function debugLog(message: string) {
6
+ if (isVerbose()) {
7
+ const timestamp = new Date().toISOString().split('T')[1].split('Z')[0];
8
+ console.log(`[NET DEBUG ${timestamp}] ${message}`);
9
+ }
10
+ }
11
+
5
12
  export interface PeerCertificate {
6
13
  subject: { [key: string]: string }
7
14
  issuer: { [key: string]: string }
@@ -26,6 +33,13 @@ export interface ConnectionOptions extends SocketOptions {
26
33
  pfx?: string | ArrayBuffer
27
34
  passphrase?: string
28
35
  keylog?: boolean // Enable keylogging (SSLKEYLOGFILE format)
36
+ /**
37
+ * Custom hostname verification function.
38
+ * If provided, it will be called after the TLS handshake to verify the peer certificate.
39
+ * Return `undefined` if valid, or an `Error` if invalid.
40
+ * If not provided, the default `checkServerIdentity` is used.
41
+ */
42
+ checkServerIdentity?: (hostname: string, cert: PeerCertificate) => Error | undefined
29
43
  }
30
44
 
31
45
  export interface SecureContextOptions {
@@ -179,7 +193,11 @@ export class TLSSocket extends Socket {
179
193
 
180
194
  renegotiate(options: any, callback: (err: Error | null) => void): boolean {
181
195
  if (callback) {
182
- process.nextTick(() => callback(new Error('Renegotiation is not supported by rustls')));
196
+ setTimeout(() => {
197
+ const err = new Error('Renegotiation is not supported by rustls');
198
+ (err as any).code = 'ERR_TLS_RENEGOTIATION_DISABLED';
199
+ callback(err);
200
+ }, 0);
183
201
  }
184
202
  return false;
185
203
  }
@@ -188,6 +206,39 @@ export class TLSSocket extends Socket {
188
206
  // No-op, already effectively disabled
189
207
  }
190
208
 
209
+ /**
210
+ * Enables trace output for this socket.
211
+ */
212
+ enableTrace(): void {
213
+ const driver = (this as any)._driver as NetSocketDriver
214
+ if (driver) {
215
+ driver.enableTrace()
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Exports keying material for use by external protocols.
221
+ *
222
+ * @param length The number of bytes to return.
223
+ * @param label A label identifying the keying material.
224
+ * @param context An optional context.
225
+ * @returns Buffer containing keying material.
226
+ * @throws Error if export fails (e.g., TLS not connected).
227
+ */
228
+ exportKeyingMaterial(length: number, label: string, context?: Buffer): Buffer {
229
+ const driver = (this as any)._driver as NetSocketDriver
230
+ if (driver) {
231
+ const ctx = context ? new Uint8Array(context).buffer as ArrayBuffer : undefined
232
+ const result = driver.exportKeyingMaterial(length, label, ctx)
233
+ if (result) {
234
+ return Buffer.from(result)
235
+ }
236
+ }
237
+ const err = new Error('exportKeyingMaterial failed: TLS connection may not be established')
238
+ ; (err as any).code = 'ERR_TLS_EXPORT_KEYING_MATERIAL'
239
+ throw err
240
+ }
241
+
191
242
  constructor(socket: Socket, options?: ConnectionOptions)
192
243
  constructor(options: ConnectionOptions)
193
244
  constructor(socketOrOptions: Socket | ConnectionOptions, options?: ConnectionOptions) {
@@ -230,6 +281,21 @@ export class TLSSocket extends Socket {
230
281
  if (connectionListener) this.once('secureConnect', connectionListener);
231
282
 
232
283
  this.once('connect', () => {
284
+ // After the native TLS handshake, perform hostname verification
285
+ if (rejectUnauthorized !== false) {
286
+ const cert = this.getPeerCertificate() as PeerCertificate;
287
+ if (cert && Object.keys(cert).length > 0) {
288
+ const verifyFn = (typeof options === 'object' && options.checkServerIdentity)
289
+ ? options.checkServerIdentity
290
+ : checkServerIdentity;
291
+ const verifyErr = verifyFn(servername, cert);
292
+ if (verifyErr) {
293
+ this.emit('error', verifyErr);
294
+ this.destroy(verifyErr);
295
+ return;
296
+ }
297
+ }
298
+ }
233
299
  this.emit('secureConnect')
234
300
  })
235
301
 
@@ -255,14 +321,18 @@ export class TLSSocket extends Socket {
255
321
 
256
322
  if (path) {
257
323
  if (secureContextId !== undefined) {
324
+ debugLog(`TLSSocket.connect: Calling driver.connectUnixTLSWithContext(${path}, ${servername}, ctx=${secureContextId})`);
258
325
  driver.connectUnixTLSWithContext(path, servername, rejectUnauthorized, secureContextId)
259
326
  } else {
327
+ debugLog(`TLSSocket.connect: Calling driver.connectUnixTLS(${path}, ${servername})`);
260
328
  driver.connectUnixTLS(path, servername, rejectUnauthorized)
261
329
  }
262
330
  } else {
263
331
  if (secureContextId !== undefined) {
332
+ debugLog(`TLSSocket.connect: Calling driver.connectTLSWithContext(${host}, ${port}, ${servername}, ctx=${secureContextId})`);
264
333
  driver.connectTLSWithContext(host, port, servername, rejectUnauthorized, secureContextId)
265
334
  } else {
335
+ debugLog(`TLSSocket.connect: Calling driver.connectTLS(${host}, ${port}, ${servername})`);
266
336
  driver.connectTLS(host, port, servername, rejectUnauthorized)
267
337
  }
268
338
  }
@@ -323,6 +393,9 @@ export class Server extends NetServer {
323
393
  key: options.key,
324
394
  ca: options.ca
325
395
  }).id;
396
+ } else {
397
+ // Create empty secure context to allow late configuration (addContext)
398
+ this._secureContextId = createSecureContext().id;
326
399
  }
327
400
 
328
401
  this.on('connection', (socket: Socket) => {
@@ -408,12 +481,15 @@ export class Server extends NetServer {
408
481
 
409
482
  const driver = (this as any)._driver;
410
483
 
411
- if (handle || _path) {
412
- console.warn("TLS over Unix sockets/handles not fully implemented yet");
484
+ if (_path) {
485
+ driver.listenTLSUnix(_path, this._secureContextId, _backlog);
486
+ } else if (handle) {
487
+ console.warn("TLS over handles not fully implemented yet");
488
+ driver.listenTLS(_port || 0, this._secureContextId, _backlog, ipv6Only, reusePort);
489
+ } else {
490
+ driver.listenTLS(_port || 0, this._secureContextId, _backlog, ipv6Only, reusePort);
413
491
  }
414
492
 
415
- driver.listenTLS(_port || 0, this._secureContextId, _backlog, ipv6Only, reusePort);
416
-
417
493
  return this;
418
494
  }
419
495
  }