Skip to content

Commit

Permalink
[iOS] Start conduit only fails on unsuccessful psiphon tunnel start
Browse files Browse the repository at this point in the history
  • Loading branch information
Enda-O committed Nov 8, 2024
1 parent 450e7b8 commit fdf9511
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 25 deletions.
26 changes: 19 additions & 7 deletions ios/ConduitModule/ConduitManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -167,16 +167,21 @@ actor ConduitManager {
internetReachable: self.psiphonTunnel!.isInternetReachable)
}

func startConduit(_ params: ConduitParams) async throws -> Bool {
guard case .stopped = conduitStatus else {
return false
}
func startConduit(_ params: ConduitParams) async throws {

if psiphonTunnel == nil {
psiphonTunnelListener = PsiphonTunnelListener(listener: self)
psiphonTunnel = PsiphonTunnelAsyncWrapper(
tunneledAppDelegate: self.psiphonTunnelListener!)
}

if (conduitStatus == .starting || conduitStatus == .started) &&
psiphonTunnelListener!.isEqualConduitParams(params) {
Logger.conduitMan.warning("Restart conduit with duplicate parameters denied.")
return
}

await self.stopConduit()

let dynamicConfigs = PsiphonTunnelListener.DynamicConfigs(
conduitParams: params,
Expand All @@ -193,15 +198,18 @@ actor ConduitManager {
listener.onInproxyProxyActivity(stats: activityStats!)
} else {
setConduitStatus(.stopped)
Logger.conduitMan.debug(
"Psiphon tunnel start was unsuccessful.",
metadata: ["conduitParams": "\(String(describing: params))"]
)
throw Err("Failed to start conduit through psiphon tunnel with given parameters.")
}

return success
}

func stopConduit() async {
guard
let psiphonTunnel,
case .started = conduitStatus else {
(conduitStatus == .started || conduitStatus == .starting) else {
return
}
setConduitStatus(.stopping)
Expand Down Expand Up @@ -324,6 +332,10 @@ fileprivate final class PsiphonTunnelListener: NSObject, TunneledAppDelegate {
self.dynamicConfigs = configs
}

func isEqualConduitParams(_ conduitParams: ConduitParams) -> Bool{
return (self.dynamicConfigs?.conduitParams == conduitParams)
}

func getEmbeddedServerEntries() -> String? {
do {
let data = try Data(contentsOf: ResourceFile.embeddedServerEntries.url)
Expand Down
30 changes: 12 additions & 18 deletions ios/ConduitModule/ConduitModule.swift
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ extension ConduitModule {
func toggleInProxy(
_ maxClients: Int, limitUpstream: Int, limitDownstream: Int, privateKey: String?,
resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock
) {
) {
Task {
switch await self.conduitManager.conduitStatus {
case .stopped:
Expand All @@ -252,15 +252,13 @@ extension ConduitModule {
limitUpstream: limitUpstream,
limitDownstream: limitDownstream,
privateKey: privateKey
)
)
do {
let success = try await self.conduitManager.startConduit(params)
if !success {
sendEvent(.proxyError(.inProxyStartFailed))
}
try await self.conduitManager.startConduit(params)
} catch {
sendEvent(.proxyError(.inProxyStartFailed))
Logger.conduitModule.error( "Proxy start failed", metadata: ["error": "\(error)"])
reject("error", "Proxy start failed.", error)
Logger.conduitModule.error("Proxy start failed.", metadata: ["error": "\(error)"])
}
case .started:
await self.conduitManager.stopConduit()
Expand All @@ -284,32 +282,28 @@ extension ConduitModule {
reject("error", "Did not receive four valid key value pairs from params.", nil)
return
}
Task {

Task {
switch await self.conduitManager.conduitStatus {
case .stopping, .stopped:
// no-op
resolve(nil)

case .starting:
reject("error", "Cannot change parameters while Conduit is starting.", nil)
return
case .started, .starting:

case .started:
let params = ConduitParams(
maxClients: maxClients,
limitUpstream: limitUpstream,
limitDownstream: limitDownstream,
privateKey: privateKey
)
)
do {
let success = try await self.conduitManager.startConduit(params)
if !success {
sendEvent(.proxyError(.inProxyRestartFailed))
}
try await self.conduitManager.startConduit(params)
resolve(nil)
} catch {
sendEvent(.proxyError(.inProxyRestartFailed))
reject("error", "Proxy restart failed.", error)
Logger.conduitModule.error("Proxy restart failed.", metadata: ["error": "\(error)"])
}
}
}
Expand Down

0 comments on commit fdf9511

Please sign in to comment.