summaryrefslogtreecommitdiffhomepage
path: root/ios/MullvadREST/Transport/APITransport.swift
blob: 878226d8b016ec19eede8fd53ef40b8a013ddc18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//
//  APITransport.swift
//  MullvadVPNUITests
//
//  Created by Jon Petersson on 2025-02-24.
//  Copyright © 2025 Mullvad VPN AB. All rights reserved.
//

import MullvadRustRuntime
import MullvadTypes

public protocol APITransportProtocol {
    var name: String { get }

    func sendRequest(_ request: APIRequest, completion: @escaping @Sendable (ProxyAPIResponse) -> Void) throws
        -> Cancellable
}

public final class APITransport: APITransportProtocol {
    public var name: String {
        "app-transport"
    }

    public let requestFactory: MullvadApiRequestFactory

    public init(requestFactory: MullvadApiRequestFactory) {
        self.requestFactory = requestFactory
    }

    public func sendRequest(
        _ request: APIRequest,
        completion: @escaping @Sendable (ProxyAPIResponse) -> Void
    ) throws -> Cancellable {
        let apiRequest = requestFactory.makeRequest(request)

        return try apiRequest { response in
            let error: APIError? =
                if !response.success {
                    APIError(
                        statusCode: Int(response.statusCode),
                        errorDescription: response.errorDescription ?? "",
                        serverResponseCode: response.serverResponseCode
                    )
                } else { nil }

            completion(
                ProxyAPIResponse(
                    data: response.body,
                    error: error,
                    etag: response.etag
                ))
        }
    }
}