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