summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--ios/MullvadVPN.xcodeproj/project.pbxproj12
-rw-r--r--ios/MullvadVPN/Account.swift57
-rw-r--r--ios/MullvadVPN/AppStorePaymentManager.swift18
-rw-r--r--ios/MullvadVPN/MullvadRpc.swift (renamed from ios/MullvadVPN/MullvadAPI.swift)80
-rw-r--r--ios/MullvadVPN/RelayCache.swift18
-rw-r--r--ios/MullvadVPN/WireguardKeysViewController.swift28
6 files changed, 109 insertions, 104 deletions
diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj
index 68b147b6ca..6838aa16d4 100644
--- a/ios/MullvadVPN.xcodeproj/project.pbxproj
+++ b/ios/MullvadVPN.xcodeproj/project.pbxproj
@@ -77,7 +77,7 @@
58A8BE8323A0F362006B74AC /* UIAlertController+Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58A8BE8223A0F362006B74AC /* UIAlertController+Error.swift */; };
58A99ED3240014A0006599E9 /* ConsentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58A99ED2240014A0006599E9 /* ConsentViewController.swift */; };
58ADDB3C227B1BD200FAFEA7 /* JsonRpc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58ADDB3B227B1BD200FAFEA7 /* JsonRpc.swift */; };
- 58ADDB3E227B1CD900FAFEA7 /* MullvadAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58ADDB3D227B1CD900FAFEA7 /* MullvadAPI.swift */; };
+ 58ADDB3E227B1CD900FAFEA7 /* MullvadRpc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58ADDB3D227B1CD900FAFEA7 /* MullvadRpc.swift */; };
58AEEF652344A36000C9BBD5 /* KeychainError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58AEEF642344A36000C9BBD5 /* KeychainError.swift */; };
58AEEF662344A37400C9BBD5 /* KeychainError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58AEEF642344A36000C9BBD5 /* KeychainError.swift */; };
58AEEF682344A40800C9BBD5 /* TunnelConfigurationCoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58AEEF672344A40800C9BBD5 /* TunnelConfigurationCoder.swift */; };
@@ -96,7 +96,7 @@
58BA692F23E99F5B009DC256 /* Locking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BA692D23E99EFF009DC256 /* Locking.swift */; };
58BA693123EADA6A009DC256 /* SimulatorTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BA693023EADA6A009DC256 /* SimulatorTunnelProvider.swift */; };
58BA693223EAE1AE009DC256 /* SimulatorTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BA693023EADA6A009DC256 /* SimulatorTunnelProvider.swift */; };
- 58BFA5C022A7C8A900A6173D /* MullvadAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58ADDB3D227B1CD900FAFEA7 /* MullvadAPI.swift */; };
+ 58BFA5C022A7C8A900A6173D /* MullvadRpc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58ADDB3D227B1CD900FAFEA7 /* MullvadRpc.swift */; };
58BFA5C222A7C92900A6173D /* JsonRpc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58ADDB3B227B1BD200FAFEA7 /* JsonRpc.swift */; };
58BFA5C322A7C93400A6173D /* RelayList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5888AD88227B18C40051EB06 /* RelayList.swift */; };
58BFA5C622A7C97F00A6173D /* RelayCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BFA5C522A7C97F00A6173D /* RelayCache.swift */; };
@@ -234,7 +234,7 @@
58A8BE8223A0F362006B74AC /* UIAlertController+Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIAlertController+Error.swift"; sourceTree = "<group>"; };
58A99ED2240014A0006599E9 /* ConsentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConsentViewController.swift; sourceTree = "<group>"; };
58ADDB3B227B1BD200FAFEA7 /* JsonRpc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JsonRpc.swift; sourceTree = "<group>"; };
- 58ADDB3D227B1CD900FAFEA7 /* MullvadAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MullvadAPI.swift; sourceTree = "<group>"; };
+ 58ADDB3D227B1CD900FAFEA7 /* MullvadRpc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MullvadRpc.swift; sourceTree = "<group>"; };
58AEEF642344A36000C9BBD5 /* KeychainError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainError.swift; sourceTree = "<group>"; };
58AEEF672344A40800C9BBD5 /* TunnelConfigurationCoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelConfigurationCoder.swift; sourceTree = "<group>"; };
58AEEF6A2344A46200C9BBD5 /* TunnelConfigurationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelConfigurationManager.swift; sourceTree = "<group>"; };
@@ -407,8 +407,8 @@
587B08DF229433EB000E6F17 /* LoginState.swift */,
58CE5E65224146200008646E /* LoginViewController.swift */,
58CE5E67224146200008646E /* Main.storyboard */,
- 58ADDB3D227B1CD900FAFEA7 /* MullvadAPI.swift */,
5840250322B11AB700E4CFEC /* MullvadEndpoint.swift */,
+ 58ADDB3D227B1CD900FAFEA7 /* MullvadRpc.swift */,
58FBDAAA22A52DC500EB69A3 /* MullvadVPN-Bridging-Header.h */,
5866F39B2243B82D00168AE5 /* MullvadVPN.entitlements */,
588AE72E2362001F009F9F2E /* MutuallyExclusive.swift */,
@@ -783,7 +783,7 @@
5845F842236CBACD00B2D93C /* PacketTunnelIpc.swift in Sources */,
58781CC922AE7CA8009B9D8E /* RelayConstraints.swift in Sources */,
584E96BC240FD4DA00D3334F /* Location.swift in Sources */,
- 58ADDB3E227B1CD900FAFEA7 /* MullvadAPI.swift in Sources */,
+ 58ADDB3E227B1CD900FAFEA7 /* MullvadRpc.swift in Sources */,
58B8743222B25A7600015324 /* WireguardAssociatedAddresses.swift in Sources */,
587B08E0229433EB000E6F17 /* LoginState.swift in Sources */,
58C6B34F22BB7AC0003C19AD /* IPAddressRange.swift in Sources */,
@@ -855,7 +855,7 @@
5840250522B11AB700E4CFEC /* MullvadEndpoint.swift in Sources */,
582650872384117900FA7A86 /* ReplaceNilWithError.swift in Sources */,
58BFA5C722A7C97F00A6173D /* RelayCache.swift in Sources */,
- 58BFA5C022A7C8A900A6173D /* MullvadAPI.swift in Sources */,
+ 58BFA5C022A7C8A900A6173D /* MullvadRpc.swift in Sources */,
58906DE02445C7A5002F0673 /* NEProviderStopReason+Debug.swift in Sources */,
58AEEF692344A43A00C9BBD5 /* TunnelConfigurationCoder.swift in Sources */,
584E96BD240FD4DA00D3334F /* Location.swift in Sources */,
diff --git a/ios/MullvadVPN/Account.swift b/ios/MullvadVPN/Account.swift
index 6677005615..989cd8a53f 100644
--- a/ios/MullvadVPN/Account.swift
+++ b/ios/MullvadVPN/Account.swift
@@ -26,14 +26,12 @@ enum AccountError: Error {
/// A enum describing the error emitted during login
enum AccountLoginError: Error {
- case network(MullvadAPI.Error)
- case communication(MullvadAPI.ResponseError)
+ case rpc(MullvadRpc.Error)
case tunnelConfiguration(TunnelManagerError)
}
enum CreateAccountError: Error {
- case network(MullvadAPI.Error)
- case communication(MullvadAPI.ResponseError)
+ case rpc(MullvadRpc.Error)
case tunnelConfiguration(TunnelManagerError)
}
@@ -53,22 +51,22 @@ extension AccountError: LocalizedError {
var failureReason: String? {
switch self {
- case .createNew(.network), .createNew(.communication):
+ case .createNew(.rpc):
return NSLocalizedString("Failed to create new account", comment: "")
- case .login(.communication(let serverError)) where serverError.code == .accountDoesNotExist:
+ case .login(.rpc(.server(let serverError))) where serverError.code == .accountDoesNotExist:
return NSLocalizedString("Invalid account", comment: "")
- case .login(.network):
+ case .login(.rpc(.network)):
return NSLocalizedString("Network error", comment: "")
- case .login(.communication):
+ case .login(.rpc(.server)):
return NSLocalizedString("Server error", comment: "")
case .login(.tunnelConfiguration(.setAccount(let setAccountError))),
.createNew(.tunnelConfiguration(.setAccount(let setAccountError))):
switch setAccountError {
- case .pushWireguardKey(.transport(.network)):
+ case .pushWireguardKey(.network):
return NSLocalizedString("Network error", comment: "")
case .pushWireguardKey(.server(let serverError)):
@@ -108,7 +106,7 @@ class Account {
static let newAccountExpiryUserInfoKey = "newAccountExpiry"
static let shared = Account()
- private let apiClient = MullvadAPI()
+ private let rpc = MullvadRpc()
/// Returns true if user agreed to terms of service, otherwise false
var isAgreedToTermsOfService: Bool {
@@ -139,17 +137,12 @@ class Account {
}
func loginWithNewAccount() -> AnyPublisher<String, AccountError> {
- return apiClient.createAccount()
- .mapError { CreateAccountError.network($0) }
- .flatMap { (response) -> AnyPublisher<(String, Date), CreateAccountError> in
- response.result
- .mapError { CreateAccountError.communication($0) }
- .publisher
- .flatMap { (accountToken) in
- TunnelManager.shared.setAccount(accountToken: accountToken)
- .mapError { CreateAccountError.tunnelConfiguration($0) }
- .map { (accountToken, Date()) }
- }.eraseToAnyPublisher()
+ return rpc.createAccount()
+ .mapError { CreateAccountError.rpc($0) }
+ .flatMap { (newAccountToken) in
+ TunnelManager.shared.setAccount(accountToken: newAccountToken)
+ .mapError { CreateAccountError.tunnelConfiguration($0) }
+ .map { (newAccountToken, Date()) }
}.mapError { AccountError.createNew($0) }
.receive(on: DispatchQueue.main)
.map { (accountToken, expiry) -> String in
@@ -162,18 +155,16 @@ class Account {
/// Perform the login and save the account token along with expiry (if available) to the
/// application preferences.
func login(with accountToken: String) -> AnyPublisher<(), AccountError> {
- return apiClient.getAccountExpiry(accountToken: accountToken)
- .mapError { AccountLoginError.network($0) }
- .flatMap { (response) in
- response.result
- .mapError { AccountLoginError.communication($0) }
- .publisher
- }.flatMap { (expiry) in
- TunnelManager.shared.setAccount(accountToken: accountToken)
- .mapError { AccountLoginError.tunnelConfiguration($0) }
- .map { expiry }
- }.mapError { AccountError.login($0) }.receive(on: DispatchQueue.main).map { (expiry) in
- self.saveAccountToPreferences(accountToken: accountToken, expiry: expiry)
+ return rpc.getAccountExpiry(accountToken: accountToken)
+ .mapError { AccountLoginError.rpc($0) }
+ .flatMap { (expiry) in
+ TunnelManager.shared.setAccount(accountToken: accountToken)
+ .mapError { AccountLoginError.tunnelConfiguration($0) }
+ .map { expiry }
+ }.mapError { AccountError.login($0) }
+ .receive(on: DispatchQueue.main)
+ .map { (expiry) in
+ self.saveAccountToPreferences(accountToken: accountToken, expiry: expiry)
}.eraseToAnyPublisher()
}
diff --git a/ios/MullvadVPN/AppStorePaymentManager.swift b/ios/MullvadVPN/AppStorePaymentManager.swift
index 04a4928fe4..ff76c379da 100644
--- a/ios/MullvadVPN/AppStorePaymentManager.swift
+++ b/ios/MullvadVPN/AppStorePaymentManager.swift
@@ -85,8 +85,7 @@ class AppStorePaymentManager {
enum SendAppStoreReceiptError: Swift.Error {
case read(AppStoreReceipt.Error)
- case network(MullvadAPI.Error)
- case server(MullvadAPI.ResponseError)
+ case rpc(MullvadRpc.Error)
}
enum Error: Swift.Error {
@@ -99,7 +98,7 @@ class AppStorePaymentManager {
static let shared = AppStorePaymentManager(queue: SKPaymentQueue.default())
private let queue: SKPaymentQueue
- private let apiClient = MullvadAPI()
+ private let rpc = MullvadRpc()
private var paymentQueueSubscriber: AnyCancellable?
private var sendReceiptSubscriber: AnyCancellable?
@@ -223,11 +222,10 @@ class AppStorePaymentManager {
return AppStoreReceipt.fetch(forceRefresh: forceRefresh)
.mapError { SendAppStoreReceiptError.read($0) }
.flatMap { (receiptData) in
- self.apiClient.sendAppStoreReceipt(accountToken: accountToken, receiptData: receiptData)
- .mapError { SendAppStoreReceiptError.network($0) }
- .flatMap({ (response) in
- response.result.mapError { SendAppStoreReceiptError.server($0) }.publisher
- })
+ self.rpc.sendAppStoreReceipt(
+ accountToken: accountToken,
+ receiptData: receiptData
+ ).mapError { SendAppStoreReceiptError.rpc($0) }
}
.receive(on: DispatchQueue.main)
.handleEvents(receiveOutput: { (response) in
@@ -345,9 +343,9 @@ extension AppStorePaymentManager.Error: LocalizedError {
switch self {
case .storePayment(let storeError):
return storeError.localizedDescription
- case .sendReceipt(.network(let urlError)):
+ case .sendReceipt(.rpc(.network(let urlError))):
return urlError.localizedDescription
- case .sendReceipt(.server(let serverError)):
+ case .sendReceipt(.rpc(.server(let serverError))):
return serverError.errorDescription
case .sendReceipt(.read(.refresh(let storeError))):
return storeError.localizedDescription
diff --git a/ios/MullvadVPN/MullvadAPI.swift b/ios/MullvadVPN/MullvadRpc.swift
index 95a01a27a7..3db2c25bf6 100644
--- a/ios/MullvadVPN/MullvadAPI.swift
+++ b/ios/MullvadVPN/MullvadRpc.swift
@@ -1,5 +1,5 @@
//
-// MullvadAPI.swift
+// MullvadRpc.swift
// MullvadVPN
//
// Created by pronebird on 02/05/2019.
@@ -32,7 +32,7 @@ struct SendAppStoreReceiptResponse: Codable {
}
}
-class MullvadAPI {
+class MullvadRpc {
private let session: URLSession
/// A enum mapping the integer codes returned by Mullvad API with the corresponding enum
@@ -73,101 +73,123 @@ class MullvadAPI {
case other(Int)
}
- /// An error type emitted by `MullvadAPI`
+ /// An error type emitted by `MullvadRpc`
enum Error: Swift.Error {
/// A network communication error
case network(URLError)
+ /// A server error
+ case server(JsonRpcResponseError<ResponseCode>)
+
/// An error occured when decoding the JSON response
case decoding(Swift.Error)
/// An error occured when encoding the JSON request
case encoding(Swift.Error)
- }
- typealias ResponseError = JsonRpcResponseError<ResponseCode>
- typealias Response<T: Decodable> = JsonRpcResponse<T, ResponseCode>
+ var localizedDescription: String {
+ switch self {
+ case .network(let urlError):
+ return "Network error: \(urlError.localizedDescription)"
+
+ case .server(let serverError):
+ return "Server error: \(serverError.localizedDescription)"
+
+ case .encoding(let encodingError):
+ return "Encoding error: \(encodingError.localizedDescription)"
+
+ case .decoding(let decodingError):
+ return "Decoding error: \(decodingError.localizedDescription)"
+ }
+ }
+ }
init(session: URLSession = URLSession.shared) {
self.session = session
}
- func createAccount() -> AnyPublisher<Response<String>, MullvadAPI.Error> {
+ func createAccount() -> AnyPublisher<String, MullvadRpc.Error> {
let request = JsonRpcRequest(method: "create_account", params: [])
- return MullvadAPI.makeDataTaskPublisher(request: request)
+ return MullvadRpc.makeDataTaskPublisher(request: request)
}
- func getRelayList() -> AnyPublisher<Response<RelayList>, MullvadAPI.Error> {
+ func getRelayList() -> AnyPublisher<RelayList, MullvadRpc.Error> {
let request = JsonRpcRequest(method: "relay_list_v3", params: [])
- return MullvadAPI.makeDataTaskPublisher(request: request)
+ return MullvadRpc.makeDataTaskPublisher(request: request)
}
- func getAccountExpiry(accountToken: String) -> AnyPublisher<Response<Date>, MullvadAPI.Error> {
+ func getAccountExpiry(accountToken: String) -> AnyPublisher<Date, MullvadRpc.Error> {
let request = JsonRpcRequest(method: "get_expiry", params: [AnyEncodable(accountToken)])
- return MullvadAPI.makeDataTaskPublisher(request: request)
+ return MullvadRpc.makeDataTaskPublisher(request: request)
}
- func pushWireguardKey(accountToken: String, publicKey: Data) -> AnyPublisher<Response<WireguardAssociatedAddresses>, MullvadAPI.Error> {
+ func pushWireguardKey(accountToken: String, publicKey: Data) -> AnyPublisher<WireguardAssociatedAddresses, MullvadRpc.Error> {
let request = JsonRpcRequest(method: "push_wg_key", params: [
AnyEncodable(accountToken),
AnyEncodable(publicKey)
])
- return MullvadAPI.makeDataTaskPublisher(request: request)
+ return MullvadRpc.makeDataTaskPublisher(request: request)
}
- func replaceWireguardKey(accountToken: String, oldPublicKey: Data, newPublicKey: Data) -> AnyPublisher<Response<WireguardAssociatedAddresses>, MullvadAPI.Error> {
+ func replaceWireguardKey(accountToken: String, oldPublicKey: Data, newPublicKey: Data) -> AnyPublisher<WireguardAssociatedAddresses, MullvadRpc.Error> {
let request = JsonRpcRequest(method: "replace_wg_key", params: [
AnyEncodable(accountToken),
AnyEncodable(oldPublicKey),
AnyEncodable(newPublicKey)
])
- return MullvadAPI.makeDataTaskPublisher(request: request)
+ return MullvadRpc.makeDataTaskPublisher(request: request)
}
- func checkWireguardKey(accountToken: String, publicKey: Data) -> AnyPublisher<Response<Bool>, MullvadAPI.Error> {
+ func checkWireguardKey(accountToken: String, publicKey: Data) -> AnyPublisher<Bool, MullvadRpc.Error> {
let request = JsonRpcRequest(method: "check_wg_key", params: [
AnyEncodable(accountToken),
AnyEncodable(publicKey)
])
- return MullvadAPI.makeDataTaskPublisher(request: request)
+ return MullvadRpc.makeDataTaskPublisher(request: request)
}
- func removeWireguardKey(accountToken: String, publicKey: Data) -> AnyPublisher<Response<Bool>, MullvadAPI.Error> {
+ func removeWireguardKey(accountToken: String, publicKey: Data) -> AnyPublisher<Bool, MullvadRpc.Error> {
let request = JsonRpcRequest(method: "remove_wg_key", params: [
AnyEncodable(accountToken),
AnyEncodable(publicKey)
])
- return MullvadAPI.makeDataTaskPublisher(request: request)
+ return MullvadRpc.makeDataTaskPublisher(request: request)
}
- func sendAppStoreReceipt(accountToken: String, receiptData: Data) -> AnyPublisher<Response<SendAppStoreReceiptResponse>, MullvadAPI.Error> {
+ func sendAppStoreReceipt(accountToken: String, receiptData: Data) -> AnyPublisher<SendAppStoreReceiptResponse, MullvadRpc.Error> {
let request = JsonRpcRequest(method: "apple_payment", params: [
AnyEncodable(accountToken),
AnyEncodable(receiptData)
])
- return MullvadAPI.makeDataTaskPublisher(request: request)
+ return MullvadRpc.makeDataTaskPublisher(request: request)
}
- private static func makeDataTaskPublisher<T: Decodable>(request: JsonRpcRequest) -> AnyPublisher<Response<T>, MullvadAPI.Error> {
+ private static func makeDataTaskPublisher<T: Decodable>(request: JsonRpcRequest) -> AnyPublisher<T, MullvadRpc.Error> {
return Just(request)
.encode(encoder: makeJSONEncoder())
- .mapError { MullvadAPI.Error.encoding($0) }
+ .mapError { MullvadRpc.Error.encoding($0) }
.map { self.makeURLRequest(httpBody: $0) }
.flatMap {
URLSession.shared.dataTaskPublisher(for: $0)
- .mapError { MullvadAPI.Error.network($0) }
- .flatMap { (data, response) in
+ .mapError { MullvadRpc.Error.network($0) }
+ .flatMap { (data, httpResponse) in
Just(data)
- .decode(type: Response<T>.self, decoder: makeJSONDecoder())
- .mapError { MullvadAPI.Error.decoding($0) }
+ .decode(type: JsonRpcResponse<T, ResponseCode>.self, decoder: makeJSONDecoder())
+ .mapError { MullvadRpc.Error.decoding($0) }
+ .flatMap { (serverResponse) in
+ // unwrap JsonRpcResponse.result
+ serverResponse.result
+ .mapError { MullvadRpc.Error.server($0) }
+ .publisher
+ }
}
}.eraseToAnyPublisher()
}
@@ -201,7 +223,7 @@ class MullvadAPI {
extension JsonRpcResponseError: LocalizedError
where
- ResponseCode == MullvadAPI.ResponseCode
+ ResponseCode == MullvadRpc.ResponseCode
{
var errorDescription: String? {
switch code {
diff --git a/ios/MullvadVPN/RelayCache.swift b/ios/MullvadVPN/RelayCache.swift
index 5bb4082fbb..8512f2160b 100644
--- a/ios/MullvadVPN/RelayCache.swift
+++ b/ios/MullvadVPN/RelayCache.swift
@@ -15,8 +15,7 @@ enum RelayCacheError: Error {
case defaultLocationNotFound
case io(Error)
case coding(Error)
- case network(MullvadAPI.Error)
- case server(JsonRpcResponseError<MullvadAPI.ResponseCode>)
+ case rpc(MullvadRpc.Error)
}
/// A enum describing the source of the relay list
@@ -31,7 +30,7 @@ enum RelayListSource {
class RelayCache {
/// Mullvad API client
- private let apiClient: MullvadAPI
+ private let rpc: MullvadRpc
/// The cache location used by the class instance
private let cacheFileURL: URL
@@ -51,7 +50,7 @@ class RelayCache {
}
init(cacheFileURL: URL, networkSession: URLSession = URLSession.shared) {
- apiClient = MullvadAPI(session: networkSession)
+ rpc = MullvadRpc(session: networkSession)
self.cacheFileURL = cacheFileURL
}
@@ -153,14 +152,9 @@ class RelayCache {
}
private func downloadRelays() -> AnyPublisher<RelayList, RelayCacheError> {
- apiClient.getRelayList()
- .mapError({ (networkError) -> RelayCacheError in
- return .network(networkError)
- })
- .flatMap({ (response) in
- return response.result.publisher
- .mapError { RelayCacheError.server($0) }
- }).eraseToAnyPublisher()
+ rpc.getRelayList()
+ .mapError { .rpc($0) }
+ .eraseToAnyPublisher()
}
private func saveRelayListToCache(relayList: RelayList) -> AnyPublisher<CachedRelayList, RelayCacheError> {
diff --git a/ios/MullvadVPN/WireguardKeysViewController.swift b/ios/MullvadVPN/WireguardKeysViewController.swift
index 3ce6ac3e5f..1a50dc9c7e 100644
--- a/ios/MullvadVPN/WireguardKeysViewController.swift
+++ b/ios/MullvadVPN/WireguardKeysViewController.swift
@@ -24,9 +24,12 @@ private enum WireguardKeysViewState {
case regeneratingKey
}
-enum VerifyWireguardPublicKeyError {
- case network(MullvadAPI.Error)
- case server(MullvadAPI.ResponseError)
+private struct VerifyWireguardPublicKeyError: Error {
+ var underlyingError: MullvadRpc.Error
+
+ init(_ error: MullvadRpc.Error) {
+ self.underlyingError = error
+ }
}
extension VerifyWireguardPublicKeyError: LocalizedError {
@@ -35,12 +38,14 @@ extension VerifyWireguardPublicKeyError: LocalizedError {
}
var failureReason: String? {
- switch self {
- case .network(.network(let urlError)):
+ switch underlyingError {
+ case .network(let urlError):
return urlError.localizedDescription
+
case .server(let serverError):
return serverError.errorDescription
- default:
+
+ case .decoding, .encoding:
return NSLocalizedString("Internal error", comment: "")
}
}
@@ -60,7 +65,7 @@ class WireguardKeysViewController: UIViewController {
private var creationDateTimerSubscriber: AnyCancellable?
private var copyToPasteboardSubscriber: AnyCancellable?
- private let apiClient = MullvadAPI()
+ private let rpc = MullvadRpc()
private var publicKey: WireguardPublicKey?
private var state: WireguardKeysViewState = .default {
@@ -207,18 +212,13 @@ class WireguardKeysViewController: UIViewController {
}
private func verifyKey(accountToken: String, publicKey: WireguardPublicKey) {
- verifyKeySubscriber = apiClient.checkWireguardKey(
+ verifyKeySubscriber = rpc.checkWireguardKey(
accountToken: accountToken,
publicKey: publicKey.rawRepresentation
)
.retry(1)
.receive(on: DispatchQueue.main)
- .mapError { VerifyWireguardPublicKeyError.network($0) }
- .flatMap({ (response) in
- response.result
- .mapError { VerifyWireguardPublicKeyError.server($0) }
- .publisher
- })
+ .mapError { VerifyWireguardPublicKeyError($0) }
.handleEvents(receiveSubscription: { _ in
self.updateViewState(.verifyingKey)
})