Underlying VPN Logic

This commit is contained in:
GFWFighter
2023-10-17 03:15:15 +03:30
parent 7b2129ad6d
commit fe7cdc276e
12 changed files with 869 additions and 28 deletions

View File

@@ -7,30 +7,31 @@
import NetworkExtension
class PacketTunnelProvider: NEPacketTunnelProvider {
class PacketTunnelProvider: ExtensionProvider {
override func startTunnel(options: [String : NSObject]?, completionHandler: @escaping (Error?) -> Void) {
// Add code here to start the process of connecting the tunnel.
}
private var upload: Int64 = 0
private var download: Int64 = 0
private var trafficLock: NSLock = NSLock()
override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
// Add code here to start the process of stopping the tunnel.
completionHandler()
}
var trafficReader: TrafficReader!
override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)?) {
// Add code here to handle the message.
if let handler = completionHandler {
handler(messageData)
override func startTunnel(options: [String : NSObject]?) async throws {
try await super.startTunnel(options: options)
trafficReader = TrafficReader { [unowned self] traffic in
trafficLock.lock()
upload += traffic.up
download += traffic.down
trafficLock.unlock()
}
}
override func sleep(completionHandler: @escaping () -> Void) {
// Add code here to get ready to sleep.
completionHandler()
}
override func wake() {
// Add code here to wake up.
override func handleAppMessage(_ messageData: Data) async -> Data? {
let message = String(data: messageData, encoding: .utf8)
switch message {
case "stats":
return "\(upload),\(download)".data(using: .utf8)!
default:
return nil
}
}
}