react-native-nitro-net 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +56 -4
  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/HybridNetDriver.hpp +68 -0
  7. package/cpp/HybridNetServerDriver.hpp +9 -0
  8. package/cpp/HybridNetSocketDriver.hpp +149 -0
  9. package/cpp/NetBindings.hpp +52 -1
  10. package/ios/Frameworks/RustCNet.xcframework/Info.plist +5 -5
  11. package/ios/Frameworks/RustCNet.xcframework/ios-arm64/RustCNet.framework/RustCNet +0 -0
  12. package/ios/Frameworks/RustCNet.xcframework/ios-arm64_x86_64-simulator/RustCNet.framework/RustCNet +0 -0
  13. package/lib/Net.nitro.d.ts +27 -1
  14. package/lib/Net.nitro.js +3 -1
  15. package/lib/index.d.ts +4 -3
  16. package/lib/index.js +47 -6
  17. package/lib/tls.d.ts +124 -0
  18. package/lib/tls.js +451 -0
  19. package/nitrogen/generated/android/c++/JHybridNetDriverSpec.cpp +38 -1
  20. package/nitrogen/generated/android/c++/JHybridNetDriverSpec.hpp +8 -0
  21. package/nitrogen/generated/android/c++/JHybridNetServerDriverSpec.cpp +4 -0
  22. package/nitrogen/generated/android/c++/JHybridNetServerDriverSpec.hpp +1 -0
  23. package/nitrogen/generated/android/c++/JHybridNetSocketDriverSpec.cpp +70 -0
  24. package/nitrogen/generated/android/c++/JHybridNetSocketDriverSpec.hpp +15 -0
  25. package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridNetDriverSpec.kt +33 -0
  26. package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridNetServerDriverSpec.kt +4 -0
  27. package/nitrogen/generated/android/kotlin/com/margelo/nitro/net/HybridNetSocketDriverSpec.kt +60 -0
  28. package/nitrogen/generated/ios/RustCNet-Swift-Cxx-Bridge.hpp +95 -44
  29. package/nitrogen/generated/ios/c++/HybridNetDriverSpecSwift.hpp +58 -0
  30. package/nitrogen/generated/ios/c++/HybridNetServerDriverSpecSwift.hpp +6 -0
  31. package/nitrogen/generated/ios/c++/HybridNetSocketDriverSpecSwift.hpp +109 -0
  32. package/nitrogen/generated/ios/swift/HybridNetDriverSpec.swift +8 -0
  33. package/nitrogen/generated/ios/swift/HybridNetDriverSpec_cxx.swift +118 -0
  34. package/nitrogen/generated/ios/swift/HybridNetServerDriverSpec.swift +1 -0
  35. package/nitrogen/generated/ios/swift/HybridNetServerDriverSpec_cxx.swift +25 -0
  36. package/nitrogen/generated/ios/swift/HybridNetSocketDriverSpec.swift +15 -0
  37. package/nitrogen/generated/ios/swift/HybridNetSocketDriverSpec_cxx.swift +278 -0
  38. package/nitrogen/generated/shared/c++/HybridNetDriverSpec.cpp +8 -0
  39. package/nitrogen/generated/shared/c++/HybridNetDriverSpec.hpp +9 -0
  40. package/nitrogen/generated/shared/c++/HybridNetServerDriverSpec.cpp +1 -0
  41. package/nitrogen/generated/shared/c++/HybridNetServerDriverSpec.hpp +1 -0
  42. package/nitrogen/generated/shared/c++/HybridNetSocketDriverSpec.cpp +15 -0
  43. package/nitrogen/generated/shared/c++/HybridNetSocketDriverSpec.hpp +16 -0
  44. package/package.json +5 -3
  45. package/react-native-nitro-net.podspec +1 -3
  46. package/src/Net.nitro.ts +27 -1
  47. package/src/index.ts +18 -9
  48. package/src/tls.ts +532 -0
@@ -19,6 +19,7 @@ namespace margelo::nitro::net {
19
19
  prototype.registerHybridGetter("maxConnections", &HybridNetServerDriverSpec::getMaxConnections);
20
20
  prototype.registerHybridSetter("maxConnections", &HybridNetServerDriverSpec::setMaxConnections);
21
21
  prototype.registerHybridMethod("listen", &HybridNetServerDriverSpec::listen);
22
+ prototype.registerHybridMethod("listenTLS", &HybridNetServerDriverSpec::listenTLS);
22
23
  prototype.registerHybridMethod("listenUnix", &HybridNetServerDriverSpec::listenUnix);
23
24
  prototype.registerHybridMethod("listenHandle", &HybridNetServerDriverSpec::listenHandle);
24
25
  prototype.registerHybridMethod("getLocalAddress", &HybridNetServerDriverSpec::getLocalAddress);
@@ -55,6 +55,7 @@ namespace margelo::nitro::net {
55
55
  public:
56
56
  // Methods
57
57
  virtual void listen(double port, std::optional<double> backlog, std::optional<bool> ipv6Only, std::optional<bool> reusePort) = 0;
58
+ virtual void listenTLS(double port, double secureContextId, std::optional<double> backlog, std::optional<bool> ipv6Only, std::optional<bool> reusePort) = 0;
58
59
  virtual void listenUnix(const std::string& path, std::optional<double> backlog) = 0;
59
60
  virtual void listenHandle(double fd, std::optional<double> backlog) = 0;
60
61
  virtual std::string getLocalAddress() = 0;
@@ -18,7 +18,21 @@ namespace margelo::nitro::net {
18
18
  prototype.registerHybridGetter("onEvent", &HybridNetSocketDriverSpec::getOnEvent);
19
19
  prototype.registerHybridSetter("onEvent", &HybridNetSocketDriverSpec::setOnEvent);
20
20
  prototype.registerHybridMethod("connect", &HybridNetSocketDriverSpec::connect);
21
+ prototype.registerHybridMethod("connectTLS", &HybridNetSocketDriverSpec::connectTLS);
22
+ prototype.registerHybridMethod("connectTLSWithContext", &HybridNetSocketDriverSpec::connectTLSWithContext);
23
+ prototype.registerHybridMethod("getAuthorizationError", &HybridNetSocketDriverSpec::getAuthorizationError);
24
+ prototype.registerHybridMethod("getProtocol", &HybridNetSocketDriverSpec::getProtocol);
25
+ prototype.registerHybridMethod("getCipher", &HybridNetSocketDriverSpec::getCipher);
26
+ prototype.registerHybridMethod("getALPN", &HybridNetSocketDriverSpec::getALPN);
27
+ prototype.registerHybridMethod("getPeerCertificateJSON", &HybridNetSocketDriverSpec::getPeerCertificateJSON);
28
+ prototype.registerHybridMethod("getEphemeralKeyInfo", &HybridNetSocketDriverSpec::getEphemeralKeyInfo);
29
+ prototype.registerHybridMethod("getSharedSigalgs", &HybridNetSocketDriverSpec::getSharedSigalgs);
30
+ prototype.registerHybridMethod("isSessionReused", &HybridNetSocketDriverSpec::isSessionReused);
31
+ prototype.registerHybridMethod("getSession", &HybridNetSocketDriverSpec::getSession);
32
+ prototype.registerHybridMethod("setSession", &HybridNetSocketDriverSpec::setSession);
21
33
  prototype.registerHybridMethod("connectUnix", &HybridNetSocketDriverSpec::connectUnix);
34
+ prototype.registerHybridMethod("connectUnixTLS", &HybridNetSocketDriverSpec::connectUnixTLS);
35
+ prototype.registerHybridMethod("connectUnixTLSWithContext", &HybridNetSocketDriverSpec::connectUnixTLSWithContext);
22
36
  prototype.registerHybridMethod("write", &HybridNetSocketDriverSpec::write);
23
37
  prototype.registerHybridMethod("pause", &HybridNetSocketDriverSpec::pause);
24
38
  prototype.registerHybridMethod("resume", &HybridNetSocketDriverSpec::resume);
@@ -26,6 +40,7 @@ namespace margelo::nitro::net {
26
40
  prototype.registerHybridMethod("setTimeout", &HybridNetSocketDriverSpec::setTimeout);
27
41
  prototype.registerHybridMethod("destroy", &HybridNetSocketDriverSpec::destroy);
28
42
  prototype.registerHybridMethod("resetAndDestroy", &HybridNetSocketDriverSpec::resetAndDestroy);
43
+ prototype.registerHybridMethod("enableKeylog", &HybridNetSocketDriverSpec::enableKeylog);
29
44
  prototype.registerHybridMethod("setNoDelay", &HybridNetSocketDriverSpec::setNoDelay);
30
45
  prototype.registerHybridMethod("setKeepAlive", &HybridNetSocketDriverSpec::setKeepAlive);
31
46
  prototype.registerHybridMethod("getLocalAddress", &HybridNetSocketDriverSpec::getLocalAddress);
@@ -18,6 +18,7 @@
18
18
  #include <NitroModules/ArrayBuffer.hpp>
19
19
  #include <functional>
20
20
  #include <string>
21
+ #include <optional>
21
22
 
22
23
  namespace margelo::nitro::net {
23
24
 
@@ -53,7 +54,21 @@ namespace margelo::nitro::net {
53
54
  public:
54
55
  // Methods
55
56
  virtual void connect(const std::string& host, double port) = 0;
57
+ virtual void connectTLS(const std::string& host, double port, const std::optional<std::string>& serverName, std::optional<bool> rejectUnauthorized) = 0;
58
+ virtual void connectTLSWithContext(const std::string& host, double port, const std::optional<std::string>& serverName, std::optional<bool> rejectUnauthorized, std::optional<double> secureContextId) = 0;
59
+ virtual std::optional<std::string> getAuthorizationError() = 0;
60
+ virtual std::optional<std::string> getProtocol() = 0;
61
+ virtual std::optional<std::string> getCipher() = 0;
62
+ virtual std::optional<std::string> getALPN() = 0;
63
+ virtual std::optional<std::string> getPeerCertificateJSON() = 0;
64
+ virtual std::optional<std::string> getEphemeralKeyInfo() = 0;
65
+ virtual std::optional<std::string> getSharedSigalgs() = 0;
66
+ virtual bool isSessionReused() = 0;
67
+ virtual std::optional<std::shared_ptr<ArrayBuffer>> getSession() = 0;
68
+ virtual void setSession(const std::shared_ptr<ArrayBuffer>& session) = 0;
56
69
  virtual void connectUnix(const std::string& path) = 0;
70
+ virtual void connectUnixTLS(const std::string& path, const std::optional<std::string>& serverName, std::optional<bool> rejectUnauthorized) = 0;
71
+ virtual void connectUnixTLSWithContext(const std::string& path, const std::optional<std::string>& serverName, std::optional<bool> rejectUnauthorized, std::optional<double> secureContextId) = 0;
57
72
  virtual void write(const std::shared_ptr<ArrayBuffer>& data) = 0;
58
73
  virtual void pause() = 0;
59
74
  virtual void resume() = 0;
@@ -61,6 +76,7 @@ namespace margelo::nitro::net {
61
76
  virtual void setTimeout(double timeout) = 0;
62
77
  virtual void destroy() = 0;
63
78
  virtual void resetAndDestroy() = 0;
79
+ virtual void enableKeylog() = 0;
64
80
  virtual void setNoDelay(bool enable) = 0;
65
81
  virtual void setKeepAlive(bool enable, double delay) = 0;
66
82
  virtual std::string getLocalAddress() = 0;
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "react-native-nitro-net",
3
- "version": "0.1.5",
4
3
  "description": "Ultra-high-performance networking to React Native by combining a memory-safe Rust core with the zero-overhead Nitro Modules JSI bridge. Provides Node.js-compatible net API.",
4
+ "version": "0.2.0",
5
5
  "main": "./lib/index.js",
6
6
  "module": "./lib/index.js",
7
7
  "types": "./lib/index.d.ts",
8
+ "react-native": "src/index.ts",
8
9
  "keywords": [
9
10
  "react-native",
10
11
  "ios",
@@ -24,6 +25,7 @@
24
25
  "url": "https://github.com/iwater/react-native-nitro-net/issues"
25
26
  },
26
27
  "scripts": {
28
+ "one": "yarn copy-clib && yarn build && yarn pack",
27
29
  "build": "npx nitrogen@0.32.0 && tsc",
28
30
  "prepare": "npm run build",
29
31
  "copy-clib": "rm -rf ios/Frameworks/RustCNet.xcframework && cp -R ../rust_c_net/target/xcframework/RustCNet.xcframework ios/Frameworks/ && mkdir -p android/libs/arm64-v8a android/libs/armeabi-v7a android/libs/x86 android/libs/x86_64 && cp ../rust_c_net/target/aarch64-linux-android/release/librust_c_net.so android/libs/arm64-v8a/ && cp ../rust_c_net/target/armv7-linux-androideabi/release/librust_c_net.so android/libs/armeabi-v7a/ && cp ../rust_c_net/target/i686-linux-android/release/librust_c_net.so android/libs/x86/ && cp ../rust_c_net/target/x86_64-linux-android/release/librust_c_net.so android/libs/x86_64/ && cp ../rust_c_net/include/NetBindings.hpp cpp/",
@@ -32,7 +34,7 @@
32
34
  },
33
35
  "dependencies": {
34
36
  "eventemitter3": "^5.0.1",
35
- "react-native-nitro-buffer": "^0.0.11",
37
+ "react-native-nitro-buffer": "^0.0.13",
36
38
  "readable-stream": "^4.7.0"
37
39
  },
38
40
  "devDependencies": {
@@ -56,4 +58,4 @@
56
58
  "nitrogen/",
57
59
  "*.podspec"
58
60
  ]
59
- }
61
+ }
@@ -34,9 +34,7 @@ Pod::Spec.new do |s|
34
34
  "\"$(PODS_TARGET_SRCROOT)/nitrogen/generated/shared\"",
35
35
  "\"$(PODS_TARGET_SRCROOT)/nitrogen/generated/ios/c++\"",
36
36
  "\"$(PODS_TARGET_SRCROOT)/nitrogen/generated/ios\"",
37
- "\"$(PODS_TARGET_SRCROOT)/cpp\"",
38
- "\"$(PODS_TARGET_SRCROOT)/ios/Frameworks/RustCNet.xcframework/ios-arm64/RustCNet.framework/Headers\"",
39
- "\"$(PODS_TARGET_SRCROOT)/ios/Frameworks/RustCNet.xcframework/ios-arm64_x86_64-simulator/RustCNet.framework/Headers\""
37
+ "\"$(PODS_TARGET_SRCROOT)/cpp\""
40
38
  ],
41
39
  "OTHER_SWIFT_FLAGS" => "-cxx-interoperability-mode=default"
42
40
  }
package/src/Net.nitro.ts CHANGED
@@ -19,13 +19,29 @@ export enum NetSocketEvent {
19
19
  DRAIN = 5,
20
20
  TIMEOUT = 7,
21
21
  LOOKUP = 8,
22
- DEBUG = 9
22
+ SESSION = 9,
23
+ KEYLOG = 10,
24
+ OCSP = 11
23
25
  }
24
26
 
25
27
  export interface NetSocketDriver extends HybridObject<{ ios: 'swift', android: 'kotlin' }> {
26
28
  readonly id: number
27
29
  connect(host: string, port: number): void
30
+ connectTLS(host: string, port: number, serverName?: string, rejectUnauthorized?: boolean): void
31
+ connectTLSWithContext(host: string, port: number, serverName?: string, rejectUnauthorized?: boolean, secureContextId?: number): void
32
+ getAuthorizationError(): string | undefined
33
+ getProtocol(): string | undefined
34
+ getCipher(): string | undefined
35
+ getALPN(): string | undefined
36
+ getPeerCertificateJSON(): string | undefined
37
+ getEphemeralKeyInfo(): string | undefined
38
+ getSharedSigalgs(): string | undefined
39
+ isSessionReused(): boolean
40
+ getSession(): ArrayBuffer | undefined
41
+ setSession(session: ArrayBuffer): void
28
42
  connectUnix(path: string): void
43
+ connectUnixTLS(path: string, serverName?: string, rejectUnauthorized?: boolean): void
44
+ connectUnixTLSWithContext(path: string, serverName?: string, rejectUnauthorized?: boolean, secureContextId?: number): void
29
45
  write(data: ArrayBuffer): void
30
46
  pause(): void
31
47
  resume(): void
@@ -33,6 +49,7 @@ export interface NetSocketDriver extends HybridObject<{ ios: 'swift', android: '
33
49
  setTimeout(timeout: number): void
34
50
  destroy(): void
35
51
  resetAndDestroy(): void
52
+ enableKeylog(): void
36
53
  setNoDelay(enable: boolean): void
37
54
  setKeepAlive(enable: boolean, delay: number): void
38
55
  getLocalAddress(): string
@@ -50,6 +67,7 @@ export enum NetServerEvent {
50
67
  export interface NetServerDriver extends HybridObject<{ ios: 'swift', android: 'kotlin' }> {
51
68
  onEvent: (event: number, data: ArrayBuffer) => void
52
69
  listen(port: number, backlog?: number, ipv6Only?: boolean, reusePort?: boolean): void
70
+ listenTLS(port: number, secureContextId: number, backlog?: number, ipv6Only?: boolean, reusePort?: boolean): void
53
71
  listenUnix(path: string, backlog?: number): void
54
72
  /**
55
73
  * Listen on an existing file descriptor (handle)
@@ -76,6 +94,14 @@ export interface NetConfig {
76
94
  export interface NetDriver extends HybridObject<{ ios: 'swift', android: 'kotlin' }> {
77
95
  createSocket(id?: string): NetSocketDriver
78
96
  createServer(): NetServerDriver
97
+ createSecureContext(cert: string, key: string, passphrase?: string): number
98
+ createEmptySecureContext(): number
99
+ addCACertToSecureContext(scId: number, ca: string): void
100
+ addContextToSecureContext(scId: number, hostname: string, cert: string, key: string, passphrase?: string): void
101
+ setPFXToSecureContext(scId: number, pfx: ArrayBuffer, passphrase?: string): void
102
+ setOCSPResponseToSecureContext(scId: number, ocsp: ArrayBuffer): void
103
+ getTicketKeys(scId: number): ArrayBuffer | undefined
104
+ setTicketKeys(scId: number, keys: ArrayBuffer): void
79
105
  /**
80
106
  * Initialize the network module with custom configuration
81
107
  * Must be called before any other network operations
package/src/index.ts CHANGED
@@ -165,10 +165,10 @@ export interface SocketOptions extends DuplexOptions {
165
165
  }
166
166
 
167
167
  export class Socket extends Duplex {
168
- private _driver: NetSocketDriver | undefined;
168
+ protected _driver: NetSocketDriver | undefined;
169
169
  public connecting: boolean = false; // Changed from private _connecting
170
- private _connected: boolean = false;
171
- private _hadError: boolean = false; // Added
170
+ protected _connected: boolean = false;
171
+ protected _hadError: boolean = false; // Added
172
172
  public remoteAddress?: string;
173
173
  public remotePort?: number;
174
174
  public remoteFamily?: string;
@@ -245,13 +245,14 @@ export class Socket extends Duplex {
245
245
  if (!this._driver) return;
246
246
  const id = (this._driver as any).id ?? (this._driver as any)._id;
247
247
  this._driver.onEvent = (eventType: number, data: ArrayBuffer) => {
248
+ this.emit('event', eventType, data);
248
249
  if (eventType === 3) { // ERROR
249
250
  const msg = new TextDecoder().decode(data);
250
251
  debugLog(`Socket (id: ${id}) NATIVE ERROR: ${msg}`);
251
252
  }
252
- if (eventType === 9) { // DEBUG
253
- const msg = new TextDecoder().decode(data);
254
- debugLog(`Socket (id: ${id}) NATIVE DEBUG: ${msg}`);
253
+ if (eventType === 9) { // SESSION/DEBUG
254
+ debugLog(`Socket (id: ${id}) NATIVE SESSION EVENT RECEIVED`);
255
+ this.emit('session', data);
255
256
  return;
256
257
  }
257
258
  debugLog(`Socket (id: ${id}, localPort: ${this.localPort}) Event TYPE: ${eventType}, data len: ${data?.byteLength}`);
@@ -705,8 +706,8 @@ export class Server extends EventEmitter {
705
706
  this.emit('error', new Error(data ? Buffer.from(data).toString() : 'Unknown server error'));
706
707
  break;
707
708
  case NetServerEvent.DEBUG: {
708
- const msg = data ? Buffer.from(data).toString() : 'Unknown debug message';
709
- debugLog(`Server NATIVE DEBUG: ${msg}`);
709
+ debugLog(`Server NATIVE SESSION/DEBUG EVENT RECEIVED`);
710
+ this.emit('session', data);
710
711
  break;
711
712
  }
712
713
  case NetServerEvent.CLOSE:
@@ -726,7 +727,6 @@ export class Server extends EventEmitter {
726
727
  this.close(() => resolve());
727
728
  });
728
729
  }
729
-
730
730
  listen(port?: any, host?: any, backlog?: any, callback?: any): this {
731
731
  let _port = 0;
732
732
  let _host: string | undefined;
@@ -797,6 +797,13 @@ export class Server extends EventEmitter {
797
797
  }
798
798
 
799
799
  close(callback?: (err?: Error) => void): this {
800
+ // Destroy all active connections first
801
+ for (const socket of this._sockets) {
802
+ socket.destroy();
803
+ }
804
+ this._sockets.clear();
805
+ this._connections = 0;
806
+
800
807
  this._driver.close();
801
808
  if (callback) this.once('close', callback);
802
809
  return this;
@@ -840,6 +847,8 @@ export function createServer(options?: any, connectionListener?: (socket: Socket
840
847
  return new Server(options, connectionListener);
841
848
  }
842
849
 
850
+ export * as tls from './tls'
851
+
843
852
  export {
844
853
  isIP,
845
854
  isIPv4,