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/lib/tls.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Socket, Server as NetServer, SocketOptions } from './
|
|
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
|
package/lib/tls.d.ts.map
ADDED
|
@@ -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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
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 =
|
|
17
|
+
this._id = Driver.createEmptySecureContext();
|
|
23
18
|
const pfx = typeof options.pfx === 'string' ? Buffer.from(options.pfx).buffer : options.pfx;
|
|
24
|
-
|
|
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 =
|
|
24
|
+
this._id = Driver.createSecureContext(cert, key, options.passphrase);
|
|
30
25
|
}
|
|
31
26
|
else {
|
|
32
|
-
this._id =
|
|
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
|
-
|
|
32
|
+
Driver.addCACertToSecureContext(this._id, ca);
|
|
38
33
|
}
|
|
39
34
|
}
|
|
40
35
|
}
|
|
41
36
|
setOCSPResponse(ocsp) {
|
|
42
|
-
|
|
37
|
+
Driver.setOCSPResponseToSecureContext(this._id, ocsp);
|
|
43
38
|
}
|
|
44
39
|
getTicketKeys() {
|
|
45
|
-
return
|
|
40
|
+
return Driver.getTicketKeys(this._id);
|
|
46
41
|
}
|
|
47
42
|
setTicketKeys(keys) {
|
|
48
|
-
|
|
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
|
-
|
|
50
|
+
Driver.addCACertToSecureContext(this._id, ca);
|
|
56
51
|
}
|
|
57
52
|
}
|
|
58
|
-
|
|
59
|
-
function createSecureContext(options) {
|
|
53
|
+
export function createSecureContext(options) {
|
|
60
54
|
return new SecureContext(options);
|
|
61
55
|
}
|
|
62
|
-
class TLSSocket extends
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 ?
|
|
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
|
-
|
|
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 (
|
|
342
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
};
|