diff options
| -rw-r--r-- | ios/PacketTunnelCore/Actor/PacketTunnelActor.swift | 78 | ||||
| -rw-r--r-- | ios/PacketTunnelCore/Actor/PacketTunnelActorReducer.swift | 1 |
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 { |
