调整生命周期的管理
This commit is contained in:
parent
968b86755b
commit
3225d8fa17
@ -56,19 +56,23 @@ actor SDLContextActor {
|
||||
|
||||
// 依赖的变量
|
||||
private var udpHole: SDLUDPHole?
|
||||
private var udpHoleMonitorTask: Task<Void, Never>?
|
||||
private var udpHoleLocalAddress: SocketAddress?
|
||||
|
||||
private var udpHoleV6: SDLUDPHoleV6?
|
||||
|
||||
// dns的client对象
|
||||
private var dnsClient: DNSCloudClient?
|
||||
|
||||
private var dnsMonitorTask: Task<Void, Never>?
|
||||
|
||||
// Localdns的client对象
|
||||
private let publicDnsServers = ["223.5.5.5", "119.29.29.29"]
|
||||
private var dnsLocalClient: DNSLocalClient?
|
||||
private var dnsLocalMonitorTask: Task<Void, Never>?
|
||||
|
||||
private var quicClient: SDLQUICClient?
|
||||
|
||||
private var superMonitorTask: Task<Void, Never>?
|
||||
|
||||
nonisolated private let puncherActor: SDLPuncherActor
|
||||
// 网络探测对象
|
||||
nonisolated private let proberActor: SDLNATProberActor
|
||||
@ -88,9 +92,6 @@ actor SDLContextActor {
|
||||
// 流量统计
|
||||
nonisolated private let flowTracer = SDLFlowTracer()
|
||||
|
||||
// 处理内部的需要长时间运行的任务
|
||||
private var supervisor = SDLSupervisor()
|
||||
|
||||
nonisolated private let provider: NEPacketTunnelProvider
|
||||
|
||||
// 处理权限控制
|
||||
@ -130,36 +131,11 @@ actor SDLContextActor {
|
||||
await self.puncherActor.start()
|
||||
await self.arpServer.start()
|
||||
|
||||
await self.supervisor.addWorker(name: "dnsClient") {
|
||||
SDLLogger.log("[SDLContext] dnsClient running!!!!")
|
||||
try await self.startDnsClient()
|
||||
SDLLogger.log("[SDLContext] dnsClient closed!!!!")
|
||||
}
|
||||
self.startDnsMonitor()
|
||||
self.startDnsLocalMonitor()
|
||||
|
||||
await self.supervisor.addWorker(name: "dnsLocalClient") {
|
||||
SDLLogger.log("[SDLContext] dnsLocalClient running!!!!")
|
||||
try await self.startDnsLocalClient()
|
||||
SDLLogger.log("[SDLContext] dnsLocalClient closed!!!!")
|
||||
}
|
||||
|
||||
// 启动udp
|
||||
await self.supervisor.addWorker(name: "udpHole") {
|
||||
SDLLogger.log("[SDLContext] udp running!!!!")
|
||||
try await self.startUDPHole()
|
||||
SDLLogger.log("[SDLContext] udp closed!!!!")
|
||||
}
|
||||
|
||||
await self.supervisor.addWorker(name: "quicClient") {
|
||||
SDLLogger.log("[SDLContext] superClient running!!!!")
|
||||
try await self.startQUICClient()
|
||||
SDLLogger.log("[SDLContext] superClient closed!!!!")
|
||||
}
|
||||
|
||||
// await self.supervisor.addWorker(name: "udpHoleV6") {
|
||||
// SDLLogger.log("[SDLContext] udp v6 running!!!!")
|
||||
// try await self.startUDPHoleV6()
|
||||
// SDLLogger.log("[SDLContext] udp v6 closed!!!!")
|
||||
// }
|
||||
self.startUDPHoleMonitor()
|
||||
self.startSuperMonitor()
|
||||
}
|
||||
|
||||
// 取消出口节点的时候,ip地址为: 0.0.0.0
|
||||
@ -172,7 +148,19 @@ actor SDLContextActor {
|
||||
try await self.setNetworkSettings(config: config, dnsServer: DNSHelper.dnsServer)
|
||||
}
|
||||
|
||||
private func startQUICClient() async throws {
|
||||
private func startSuperMonitor() {
|
||||
guard self.superMonitorTask == nil else {
|
||||
return
|
||||
}
|
||||
|
||||
self.superMonitorTask = self.startMonitorTask(name: "superMonitorTask") {
|
||||
SDLLogger.log("[SDLContext] superClient running!!!!")
|
||||
try await self.startSuperClient()
|
||||
SDLLogger.log("[SDLContext] superClient stop!!!!")
|
||||
}
|
||||
}
|
||||
|
||||
private func startSuperClient() async throws {
|
||||
SDLLogger.log("[SDLContext] try start quicClient", for: .debug)
|
||||
|
||||
// 启动monitor
|
||||
@ -309,6 +297,16 @@ actor SDLContextActor {
|
||||
SDLLogger.log("[SDLContext] tunnelAppNotifier ready")
|
||||
}
|
||||
|
||||
private func startDnsMonitor() {
|
||||
guard self.dnsMonitorTask == nil else {
|
||||
return
|
||||
}
|
||||
|
||||
self.dnsMonitorTask = self.startMonitorTask(name: "dnsMonitorTask") {
|
||||
try await self.startDnsClient()
|
||||
}
|
||||
}
|
||||
|
||||
private func startDnsClient() async throws {
|
||||
// 启动dns服务
|
||||
let dnsClient = DNSCloudClient(host: self.config.serverHost, port: 15353)
|
||||
@ -332,6 +330,16 @@ actor SDLContextActor {
|
||||
}
|
||||
}
|
||||
|
||||
private func startDnsLocalMonitor() {
|
||||
guard self.dnsLocalMonitorTask == nil else {
|
||||
return
|
||||
}
|
||||
|
||||
self.dnsLocalMonitorTask = self.startMonitorTask(name: "dnsLocalMonitorTask") {
|
||||
try await self.startDnsLocalClient()
|
||||
}
|
||||
}
|
||||
|
||||
private func startDnsLocalClient() async throws {
|
||||
let dnsServer = self.publicDnsServers.randomElement() ?? self.publicDnsServers[0]
|
||||
// 启动dns服务
|
||||
@ -362,6 +370,16 @@ actor SDLContextActor {
|
||||
}
|
||||
}
|
||||
|
||||
private func startUDPHoleMonitor() {
|
||||
guard self.udpHoleMonitorTask == nil else {
|
||||
return
|
||||
}
|
||||
|
||||
self.udpHoleMonitorTask = self.startMonitorTask(name: "udpHoleMonitorTask") {
|
||||
try await self.startUDPHole()
|
||||
}
|
||||
}
|
||||
|
||||
private func startUDPHole() async throws {
|
||||
// 启动udp服务器
|
||||
let udpHole = try SDLUDPHole()
|
||||
@ -485,29 +503,24 @@ actor SDLContextActor {
|
||||
|
||||
// 处理context的停止问题
|
||||
public func stop() async {
|
||||
await self.supervisor.stop()
|
||||
await self.puncherActor.stop()
|
||||
await self.arpServer.clear()
|
||||
await self.sessionManager.clear()
|
||||
|
||||
self.flowSessionManager.clear()
|
||||
|
||||
self.udpHole?.stop()
|
||||
self.udpHole = nil
|
||||
self.udpHoleMonitorTask?.cancel()
|
||||
self.udpHoleLocalAddress = nil
|
||||
|
||||
self.udpHoleV6?.stop()
|
||||
self.udpHoleV6 = nil
|
||||
|
||||
self.quicClient?.stop()
|
||||
self.quicClient = nil
|
||||
self.dnsMonitorTask?.cancel()
|
||||
self.dnsLocalMonitorTask?.cancel()
|
||||
|
||||
self.dnsClient?.stop()
|
||||
self.dnsClient = nil
|
||||
|
||||
await self.dnsLocalClient?.stop()
|
||||
self.dnsLocalClient = nil
|
||||
|
||||
self.superMonitorTask?.cancel()
|
||||
self.udpHoleMonitorTask?.cancel()
|
||||
|
||||
self.readTask?.cancel()
|
||||
self.readTask = nil
|
||||
|
||||
@ -737,6 +750,32 @@ actor SDLContextActor {
|
||||
}
|
||||
}
|
||||
|
||||
extension SDLContextActor {
|
||||
|
||||
func startMonitorTask(name: String, _ body: @escaping () async throws -> Void, retryDelay: Duration = .seconds(5)) -> Task<Void, Never> {
|
||||
return Task(name: name) {
|
||||
while true {
|
||||
do {
|
||||
try Task.checkCancellation()
|
||||
try await body()
|
||||
} catch is CancellationError {
|
||||
break
|
||||
} catch let err {
|
||||
SDLLogger.log("[SDLContextActor] worker \(name) crashed: \(err.localizedDescription)", for: .debug)
|
||||
do {
|
||||
try await Task.sleep(for: retryDelay)
|
||||
} catch is CancellationError {
|
||||
break
|
||||
} catch {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 处理和Super之间的通讯
|
||||
extension SDLContextActor {
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user