blob: bde3eafac7889efd37f67eef1c0aae52d6d7573d (
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
55
56
57
58
59
60
61
62
|
//
// VPNSettingsInteractor.swift
// MullvadVPN
//
// Created by pronebird on 31/10/2022.
// Copyright © 2025 Mullvad VPN AB. All rights reserved.
//
import Foundation
import MullvadREST
import MullvadSettings
final class VPNSettingsInteractor {
let tunnelManager: TunnelManager
private var tunnelObserver: TunnelObserver?
private let relayCacheTracker: RelayCacheTracker
var tunnelSettingsDidChange: ((LatestTunnelSettings) -> Void)?
var cachedRelaysDidChange: ((CachedRelays) -> Void)?
var tunnelSettings: LatestTunnelSettings {
tunnelManager.settings
}
var cachedRelays: CachedRelays? {
try? relayCacheTracker.getCachedRelays()
}
init(tunnelManager: TunnelManager, relayCacheTracker: RelayCacheTracker) {
self.tunnelManager = tunnelManager
self.relayCacheTracker = relayCacheTracker
let tunnelObserver =
TunnelBlockObserver(didUpdateTunnelSettings: { [weak self] _, newSettings in
self?.tunnelSettingsDidChange?(newSettings)
})
self.tunnelObserver = tunnelObserver
tunnelManager.addObserver(tunnelObserver)
}
func updateSettings(_ changes: [TunnelSettingsUpdate], completion: (@Sendable () -> Void)? = nil) {
tunnelManager.updateSettings(changes, completionHandler: completion)
}
func setPort(_ port: UInt16?, completion: (@Sendable () -> Void)? = nil) {
var relayConstraints = tunnelManager.settings.relayConstraints
if let port {
relayConstraints.port = .only(port)
} else {
relayConstraints.port = .any
}
tunnelManager.updateSettings([.relayConstraints(relayConstraints)], completionHandler: completion)
}
}
extension VPNSettingsInteractor: RelayCacheTrackerObserver {
func relayCacheTracker(_ tracker: RelayCacheTracker, didUpdateCachedRelays cachedRelays: CachedRelays) {
cachedRelaysDidChange?(cachedRelays)
}
}
|