add supervisor

This commit is contained in:
anlicheng 2026-03-10 16:30:31 +08:00
parent 10278dfef0
commit d930dbafad
2 changed files with 70 additions and 39 deletions

View File

@ -19,10 +19,9 @@ actor SDLContextActor {
case registered case registered
} }
nonisolated let config: SDLConfiguration
private var state: State = .unregistered private var state: State = .unregistered
nonisolated let config: SDLConfiguration
// nat // nat
var natType: SDLNATProberActor.NatType = .blocked var natType: SDLNATProberActor.NatType = .blocked
@ -70,7 +69,8 @@ actor SDLContextActor {
nonisolated private let flowTracer = SDLFlowTracer() nonisolated private let flowTracer = SDLFlowTracer()
// //
private var loopChildWorkers: [Task<Void, Never>] = [] private var supervisor = SDLSupervisor()
private let provider: NEPacketTunnelProvider private let provider: NEPacketTunnelProvider
// //
@ -102,37 +102,37 @@ actor SDLContextActor {
self.snapshotPublisher = snapshotPublisher self.snapshotPublisher = snapshotPublisher
} }
public func start() { public func start() async {
self.startMonitor() self.startMonitor()
self.loopChildWorkers.append(spawnLoop { await self.supervisor.addWorker(name: "quicClient") {
SDLLogger.shared.log("[SDLContext] try start quicClient") SDLLogger.shared.log("[SDLContext] try start quicClient")
let quicClient = try await self.startQUICClient() let quicClient = try await self.startQUICClient()
SDLLogger.shared.log("[SDLContext] quicClient running!!!!") SDLLogger.shared.log("[SDLContext] quicClient running!!!!")
await quicClient.waitClose() await quicClient.waitClose()
SDLLogger.shared.log("[SDLContext] quicClient closed!!!!") SDLLogger.shared.log("[SDLContext] quicClient closed!!!!")
}) }
self.loopChildWorkers.append(spawnLoop { await self.supervisor.addWorker(name: "noticeClient") {
let noticeClient = try self.startNoticeClient() let noticeClient = try self.startNoticeClient()
SDLLogger.shared.log("[SDLContext] noticeClient running!!!!") SDLLogger.shared.log("[SDLContext] noticeClient running!!!!")
try await noticeClient.waitClose() try await noticeClient.waitClose()
SDLLogger.shared.log("[SDLContext] noticeClient closed!!!!") SDLLogger.shared.log("[SDLContext] noticeClient closed!!!!")
}) }
self.loopChildWorkers.append(spawnLoop { await self.supervisor.addWorker(name: "dnsClient") {
let dnsClient = try await self.startDnsClient() let dnsClient = try await self.startDnsClient()
SDLLogger.shared.log("[SDLContext] dns running!!!!") SDLLogger.shared.log("[SDLContext] dns running!!!!")
try await dnsClient.waitClose() try await dnsClient.waitClose()
SDLLogger.shared.log("[SDLContext] dns closed!!!!") SDLLogger.shared.log("[SDLContext] dns closed!!!!")
}) }
self.loopChildWorkers.append(spawnLoop { await self.supervisor.addWorker(name: "udpHole") {
let udpHole = try await self.startUDPHole() let udpHole = try await self.startUDPHole()
SDLLogger.shared.log("[SDLContext] udp running!!!!") SDLLogger.shared.log("[SDLContext] udp running!!!!")
try await udpHole.waitClose() try await udpHole.waitClose()
SDLLogger.shared.log("[SDLContext] udp closed!!!!") SDLLogger.shared.log("[SDLContext] udp closed!!!!")
}) }
} }
private func startQUICClient() async throws -> SDLQUICClient { private func startQUICClient() async throws -> SDLQUICClient {
@ -305,8 +305,7 @@ actor SDLContextActor {
// context // context
public func stop() async { public func stop() async {
self.loopChildWorkers.forEach { $0.cancel() } await self.supervisor.stop()
self.loopChildWorkers.removeAll()
self.udpHoleWorkers?.forEach { $0.cancel() } self.udpHoleWorkers?.forEach { $0.cancel() }
self.udpHoleWorkers = nil self.udpHoleWorkers = nil

View File

@ -0,0 +1,32 @@
//
// SDLSupervisor.swift
// punchnet
//
// Created by on 2026/3/10.
//
actor SDLSupervisor {
private var loopChildWorkers: [Task<Void, Never>] = []
func addWorker(name: String, _ body: @escaping () async throws -> Void, retryDelay: Duration = .seconds(2)) {
let worker = Task(name: name) {
while !Task.isCancelled {
do {
try await body()
} catch is CancellationError {
break
} catch let err {
SDLLogger.shared.log("[Supervisor] worker \(name) crashed: \(err.localizedDescription)")
try? await Task.sleep(for: retryDelay)
}
}
}
self.loopChildWorkers.append(worker)
}
func stop() {
self.loopChildWorkers.forEach { $0.cancel() }
self.loopChildWorkers.removeAll()
}
}