45 lines
1.4 KiB
Swift
45 lines
1.4 KiB
Swift
//
|
|
// SDLContextSupervisor.swift
|
|
// Tun
|
|
//
|
|
// Created by 安礼成 on 2026/2/2.
|
|
//
|
|
|
|
import Foundation
|
|
import NetworkExtension
|
|
|
|
actor SDLContextSupervisor {
|
|
private var context: SDLContextActor?
|
|
private var tasks: [Task<Void, Never>] = []
|
|
|
|
public func start(provider: NEPacketTunnelProvider, config: SDLConfiguration, rsaCipher: RSACipher, aesCipher: AESCipher, logger: SDLLogger) async {
|
|
let context = SDLContextActor(provider: provider, config: config, rsaCipher: rsaCipher, aesCipher: aesCipher, logger: logger)
|
|
self.context = context
|
|
|
|
tasks.append(spawnLoop { try await context.startNoticeClient()})
|
|
tasks.append(spawnLoop { try await context.startUDPHole()})
|
|
tasks.append(spawnLoop { try await context.startDnsClient()})
|
|
tasks.append(spawnLoop { try await context.startMonitor()})
|
|
}
|
|
|
|
func stop() {
|
|
tasks.forEach {$0.cancel()}
|
|
tasks.removeAll()
|
|
}
|
|
|
|
private func spawnLoop(_ body: @escaping () async throws -> Void) -> Task<Void, Never> {
|
|
return Task.detached {
|
|
while !Task.isCancelled {
|
|
do {
|
|
try await body()
|
|
} catch is CancellationError {
|
|
break
|
|
} catch {
|
|
try? await Task.sleep(nanoseconds: 2_000_000_000)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|