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.
- package/README.md +70 -12
- package/android/libs/arm64-v8a/librust_c_net.so +0 -0
- package/android/libs/armeabi-v7a/librust_c_net.so +0 -0
- package/android/libs/x86/librust_c_net.so +0 -0
- package/android/libs/x86_64/librust_c_net.so +0 -0
- package/cpp/HybridHttpParser.hpp +67 -0
- package/cpp/HybridNetDriver.hpp +6 -0
- package/cpp/HybridNetServerDriver.hpp +7 -0
- package/cpp/HybridNetSocketDriver.hpp +27 -0
- package/cpp/NetBindings.hpp +15 -0
- package/ios/Frameworks/RustCNet.xcframework/Info.plist +5 -5
- package/ios/Frameworks/RustCNet.xcframework/ios-arm64/RustCNet.framework/RustCNet +0 -0
- package/ios/Frameworks/RustCNet.xcframework/ios-arm64_x86_64-simulator/RustCNet.framework/RustCNet +0 -0
- package/lib/Driver.d.ts +1 -0
- package/lib/Driver.d.ts.map +1 -0
- package/lib/Driver.js +2 -5
- package/lib/Net.nitro.d.ts +20 -0
- package/lib/Net.nitro.d.ts.map +1 -0
- package/lib/Net.nitro.js +4 -7
- package/lib/http.d.ts +204 -0
- package/lib/http.d.ts.map +1 -0
- package/lib/http.js +1126 -0
- package/lib/https.d.ts +25 -0
- package/lib/https.d.ts.map +1 -0
- package/lib/https.js +102 -0
- package/lib/index.d.ts +41 -160
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -821
- package/lib/net.d.ts +197 -0
- package/lib/net.d.ts.map +1 -0
- package/lib/net.js +875 -0
- package/lib/tls.d.ts +23 -1
- package/lib/tls.d.ts.map +1 -0
- package/lib/tls.js +108 -54
- package/nitrogen/generated/android/RustCNet+autolinking.cmake +2 -0
- package/nitrogen/generated/android/RustCNetOnLoad.cpp +2 -0
- package/nitrogen/generated/android/c++/JHybridHttpParserSpec.cpp +54 -0
- package/nitrogen/generated/android/c++/JHybridHttpParserSpec.hpp +65 -0
- package/nitrogen/generated/android/c++/JHybridNetDriverSpec.cpp +9 -0
- package/nitrogen/generated/android/c++/JHybridNetDriverSpec.hpp +1 -0
- package/nitrogen/generated/android/c++/JHybridNetServerDriverSpec.cpp +4 -0
- package/nitrogen/generated/android/c++/JHybridNetServerDriverSpec.hpp +1 -0
- package/nitrogen/generated/android/c++/JHybridNetSocketDriverSpec.cpp +9 -0
- package/nitrogen/generated/android/c++/JHybridNetSocketDriverSpec.hpp +2 -0
- package/nitrogen/generated/android/c++/JNetConfig.hpp +7 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridHttpParserSpec.kt +58 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridNetDriverSpec.kt +4 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridNetServerDriverSpec.kt +4 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridNetSocketDriverSpec.kt +8 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/NetConfig.kt +6 -3
- package/nitrogen/generated/ios/RustCNet-Swift-Cxx-Bridge.cpp +17 -0
- package/nitrogen/generated/ios/RustCNet-Swift-Cxx-Bridge.hpp +26 -0
- package/nitrogen/generated/ios/RustCNet-Swift-Cxx-Umbrella.hpp +5 -0
- package/nitrogen/generated/ios/c++/HybridHttpParserSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridHttpParserSpecSwift.hpp +79 -0
- package/nitrogen/generated/ios/c++/HybridNetDriverSpecSwift.hpp +11 -0
- package/nitrogen/generated/ios/c++/HybridNetServerDriverSpecSwift.hpp +6 -0
- package/nitrogen/generated/ios/c++/HybridNetSocketDriverSpecSwift.hpp +14 -0
- package/nitrogen/generated/ios/swift/HybridHttpParserSpec.swift +56 -0
- package/nitrogen/generated/ios/swift/HybridHttpParserSpec_cxx.swift +131 -0
- package/nitrogen/generated/ios/swift/HybridNetDriverSpec.swift +1 -0
- package/nitrogen/generated/ios/swift/HybridNetDriverSpec_cxx.swift +15 -0
- package/nitrogen/generated/ios/swift/HybridNetServerDriverSpec.swift +1 -0
- package/nitrogen/generated/ios/swift/HybridNetServerDriverSpec_cxx.swift +11 -0
- package/nitrogen/generated/ios/swift/HybridNetSocketDriverSpec.swift +2 -0
- package/nitrogen/generated/ios/swift/HybridNetSocketDriverSpec_cxx.swift +36 -0
- package/nitrogen/generated/ios/swift/NetConfig.swift +19 -1
- package/nitrogen/generated/shared/c++/HybridHttpParserSpec.cpp +21 -0
- package/nitrogen/generated/shared/c++/HybridHttpParserSpec.hpp +63 -0
- package/nitrogen/generated/shared/c++/HybridNetDriverSpec.cpp +1 -0
- package/nitrogen/generated/shared/c++/HybridNetDriverSpec.hpp +4 -0
- package/nitrogen/generated/shared/c++/HybridNetServerDriverSpec.cpp +1 -0
- package/nitrogen/generated/shared/c++/HybridNetServerDriverSpec.hpp +1 -0
- package/nitrogen/generated/shared/c++/HybridNetSocketDriverSpec.cpp +2 -0
- package/nitrogen/generated/shared/c++/HybridNetSocketDriverSpec.hpp +2 -0
- package/nitrogen/generated/shared/c++/NetConfig.hpp +6 -2
- package/package.json +9 -7
- package/src/Net.nitro.ts +17 -0
- package/src/http.ts +1303 -0
- package/src/https.ts +125 -0
- package/src/index.ts +13 -874
- package/src/net.ts +1005 -0
- package/src/tls.ts +82 -6
package/src/tls.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
import { Socket, Server as NetServer, SocketOptions } from './
|
|
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
|
-
|
|
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 (
|
|
412
|
-
|
|
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
|
}
|