blob: b16c62f705fe6f7f902618592f930e89b910650d (
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
|
//
// PacketTunnelPathObserver.swift
// PacketTunnel
//
// Created by pronebird on 10/08/2023.
// Copyright © 2023 Mullvad VPN AB. All rights reserved.
//
import Foundation
import NetworkExtension
import PacketTunnelCore
final class PacketTunnelPathObserver: DefaultPathObserverProtocol {
private weak var packetTunnelProvider: NEPacketTunnelProvider?
private let stateLock = NSLock()
private var observationToken: NSKeyValueObservation?
init(packetTunnelProvider: NEPacketTunnelProvider) {
self.packetTunnelProvider = packetTunnelProvider
}
var defaultPath: NetworkPath? {
return packetTunnelProvider?.defaultPath
}
func start(_ body: @escaping (NetworkPath) -> Void) {
stateLock.withLock {
observationToken?.invalidate()
// Normally packet tunnel provider should exist throughout the network extension lifetime.
observationToken = packetTunnelProvider?.observe(\.defaultPath, options: [.new]) { _, change in
let nwPath = change.newValue.flatMap { $0 }
if let nwPath {
body(nwPath)
}
}
}
}
func stop() {
stateLock.withLock {
observationToken?.invalidate()
observationToken = nil
}
}
}
extension NetworkExtension.NWPath: NetworkPath {}
|