summaryrefslogtreecommitdiffhomepage
path: root/ios
diff options
context:
space:
mode:
authorAndrew Bulhak <andrew.bulhak@mullvad.net>2024-05-24 15:17:16 +0200
committerBug Magnet <marco.nikic@mullvad.net>2024-05-29 13:40:11 +0200
commit002cc53666ce68ebfe6477bf760f4e7c6f603347 (patch)
tree2d7e1118b917202262b155519a22976d92f50f44 /ios
parent53765eab11a16c6a96546a53f026d20e398ad69c (diff)
downloadmullvadvpn-002cc53666ce68ebfe6477bf760f4e7c6f603347.tar.xz
mullvadvpn-002cc53666ce68ebfe6477bf760f4e7c6f603347.zip
Make PacketTunnelActor use Reducer
Diffstat (limited to 'ios')
-rw-r--r--ios/PacketTunnelCore/Actor/PacketTunnelActor.swift78
-rw-r--r--ios/PacketTunnelCore/Actor/PacketTunnelActorReducer.swift1
2 files changed, 52 insertions, 27 deletions
diff --git a/ios/PacketTunnelCore/Actor/PacketTunnelActor.swift b/ios/PacketTunnelCore/Actor/PacketTunnelActor.swift
index 153c1c0430..4391fea14d 100644
--- a/ios/PacketTunnelCore/Actor/PacketTunnelActor.swift
+++ b/ios/PacketTunnelCore/Actor/PacketTunnelActor.swift
@@ -88,44 +88,68 @@ public actor PacketTunnelActor {
self.logger.debug("Received command: \(command.logFormat())")
- switch command {
- case let .start(options):
- await start(options: options)
+ let effects = await self.runReducer(command)
- case .stop:
- await stop()
-
- case let .reconnect(nextRelay, reason):
- await reconnect(to: nextRelay, reason: reason)
-
- case let .error(reason):
- await setErrorStateInternal(with: reason)
-
- case let .notifyKeyRotated(date):
- await cacheActiveKey(lastKeyRotation: date)
-
- case .switchKey:
- await switchToCurrentKey()
-
- case let .monitorEvent(event):
- await handleMonitorEvent(event)
-
- case let .networkReachability(defaultPath):
- await handleDefaultPathChange(defaultPath)
-
- case let .replaceDevicePrivateKey(preSharedKey, ephemeralKey):
- await postQuantumConnect(with: preSharedKey, privateKey: ephemeralKey)
+ for effect in effects {
+ await executeEffect(effect)
}
}
}
}
+
+ func executeEffect(_ effect: Effect) async {
+ switch effect {
+ case .startDefaultPathObserver:
+ startDefaultPathObserver()
+ case .stopDefaultPathObserver:
+ stopDefaultPathObserver()
+ case .startTunnelMonitor:
+ setTunnelMonitorEventHandler()
+ case .stopTunnelMonitor:
+ tunnelMonitor.stop()
+ case let .updateTunnelMonitorPath(networkPath):
+ handleDefaultPathChange(networkPath)
+ case let .startConnection(nextRelay):
+ do {
+ try await tryStart(nextRelay: nextRelay)
+ } catch {
+ logger.error(error: error, message: "Failed to start the tunnel.")
+ await setErrorStateInternal(with: error)
+ }
+ case let .restartConnection(nextRelay, reason):
+ do {
+ try await tryStart(nextRelay: nextRelay, reason: reason)
+ } catch {
+ logger.error(error: error, message: "Failed to reconnect the tunnel.")
+ await setErrorStateInternal(with: error)
+ }
+ case let .reconnect(nextRelay):
+ commandChannel.send(.reconnect(nextRelay))
+ case .stopTunnelAdapter:
+ do {
+ try await tunnelAdapter.stop()
+ } catch {
+ logger.error(error: error, message: "Failed to stop adapter.")
+ }
+ state = .disconnected
+ case let .configureForErrorState(reason):
+ await setErrorStateInternal(with: reason)
+
+ case let .cacheActiveKey(lastKeyRotation):
+ cacheActiveKey(lastKeyRotation: lastKeyRotation)
+ case let .postQuantumConnect(key, privateKey: privateKey):
+ await postQuantumConnect(with: key, privateKey: privateKey)
+ case .setDisconnectedState:
+ self.state = .disconnected
+ }
+ }
}
// MARK: -
extension PacketTunnelActor {
/// Describes the reason for reconnection request.
- enum ReconnectReason {
+ enum ReconnectReason: Equatable {
/// Initiated by user.
case userInitiated
diff --git a/ios/PacketTunnelCore/Actor/PacketTunnelActorReducer.swift b/ios/PacketTunnelCore/Actor/PacketTunnelActorReducer.swift
index 9632d169d4..388ceee970 100644
--- a/ios/PacketTunnelCore/Actor/PacketTunnelActorReducer.swift
+++ b/ios/PacketTunnelCore/Actor/PacketTunnelActorReducer.swift
@@ -10,6 +10,7 @@ import Foundation
import WireGuardKitTypes
extension WireGuardKey where Self: Equatable {}
+
extension PacketTunnelActor {
/// A structure encoding an effect; each event will yield zero or more of those, which can then be sequentially executed.
enum Effect: Equatable {