diff --git a/ios/ConduitModule/ConduitManager.swift b/ios/ConduitModule/ConduitManager.swift index 16606d7..98d4de0 100644 --- a/ios/ConduitModule/ConduitManager.swift +++ b/ios/ConduitModule/ConduitManager.swift @@ -27,13 +27,6 @@ extension Logging.Logger { static let psiphonTunnel = Logger(label: "PsiphonTunnel") } -struct ConduitParams: Equatable { - let maxClients: Int - let limitUpstream: Int - let limitDownstream: Int - let privateKey: String? -} - struct ActivitySeries: Equatable { let msBucketPeriod: UInt64 let numBuckets: Int diff --git a/ios/ConduitModule/ConduitModule.mm b/ios/ConduitModule/ConduitModule.mm index 0be65a1..54b10e5 100644 --- a/ios/ConduitModule/ConduitModule.mm +++ b/ios/ConduitModule/ConduitModule.mm @@ -22,10 +22,7 @@ @interface RCT_EXTERN_MODULE(ConduitModule, RCTEventEmitter) -RCT_EXTERN_METHOD(toggleInProxy:(NSInteger)maxClients - limitUpstream:(NSInteger)limitUpstream - limitDownstream:(NSInteger)limitDownstream - privateKey:(NSString *_Nullable)privateKey +RCT_EXTERN_METHOD(toggleInProxy:(NSDictionary *)params withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject) diff --git a/ios/ConduitModule/ConduitModule.swift b/ios/ConduitModule/ConduitModule.swift index 0cf2740..6100301 100644 --- a/ios/ConduitModule/ConduitModule.swift +++ b/ios/ConduitModule/ConduitModule.swift @@ -162,6 +162,29 @@ extension ConduitEvent: ReactNativeEvent { } +/// User provided in proxy configurations received through the React Native bridge. +struct ConduitParams: Equatable { + let maxClients: Int + let limitUpstream: Int + let limitDownstream: Int + let privateKey: String? + + init?(params: NSDictionary) { + guard + let maxClients = params["maxClients"] as? Int, + let limitUpstream = params["limitUpstreamBytesPerSecond"] as? Int, + let limitDownstream = params["limitDownstreamBytesPerSecond"] as? Int, + let privateKey = params["privateKey"] as? String? + else { + return nil + } + + self.maxClients = maxClients + self.limitUpstream = limitUpstream + self.limitDownstream = limitDownstream + self.privateKey = privateKey + } +} // MARK: - ConduitModule @@ -239,22 +262,23 @@ final class ConduitModule: RCTEventEmitter { // Exported native methods extension ConduitModule { - @objc(toggleInProxy:limitUpstream:limitDownstream:privateKey:withResolver:withRejecter:) + @objc(toggleInProxy:withResolver:withRejecter:) func toggleInProxy( - _ maxClients: Int, limitUpstream: Int, limitDownstream: Int, privateKey: String?, + _ params: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock ) { + + guard let conduitParams = ConduitParams(params: params) else { + Logger.conduitModule.warning("NSDictionary to ConduitParams conversion failed.") + reject("error", "params NSDictionary could not be loaded into ConduitParams.", nil) + return + } + Task { switch await self.conduitManager.conduitStatus { case .stopped: - let params = ConduitParams( - maxClients: maxClients, - limitUpstream: limitUpstream, - limitDownstream: limitDownstream, - privateKey: privateKey - ) do { - try await self.conduitManager.startConduit(params) + try await self.conduitManager.startConduit(conduitParams) } catch { sendEvent(.proxyError(.inProxyStartFailed)) reject("error", "Proxy start failed.", error) @@ -275,14 +299,13 @@ extension ConduitModule { _ params: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock ) { - guard let maxClients = params["maxClients"] as? Int, - let limitUpstream = params["limitUpstreamBytesPerSecond"] as? Int, - let limitDownstream = params["limitDownstreamBytesPerSecond"] as? Int, - let privateKey = params["inProxyPrivateKey"] as? String? else { - reject("error", "Did not receive four valid key value pairs from params.", nil) - return - } - + + guard let conduitParams = ConduitParams(params: params) else { + Logger.conduitModule.warning("NSDictionary to ConduitParams conversion failed.") + reject("error", "params NSDictionary could not be loaded into ConduitParams.", nil) + return + } + Task { switch await self.conduitManager.conduitStatus { case .stopping, .stopped: @@ -291,14 +314,8 @@ extension ConduitModule { case .started, .starting: - let params = ConduitParams( - maxClients: maxClients, - limitUpstream: limitUpstream, - limitDownstream: limitDownstream, - privateKey: privateKey - ) do { - try await self.conduitManager.startConduit(params) + try await self.conduitManager.startConduit(conduitParams) resolve(nil) } catch { sendEvent(.proxyError(.inProxyRestartFailed))