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
@ -428,9 +427,9 @@ actor SDLContextActor {
private func handleEvent(event: SDLEvent) async { private func handleEvent(event: SDLEvent) async {
switch event { switch event {
// case .dropMacs(let dropMacsEvent): // case .dropMacs(let dropMacsEvent):
// SDLLogger.shared.log("[SDLContext] drop macs", level: .info) // SDLLogger.shared.log("[SDLContext] drop macs", level: .info)
// await self.arpServer.dropMacs(macs: dropMacsEvent.macs) // await self.arpServer.dropMacs(macs: dropMacsEvent.macs)
case .natChanged(let natChangedEvent): case .natChanged(let natChangedEvent):
let dstMac = natChangedEvent.mac let dstMac = natChangedEvent.mac
SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info) SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info)
@ -599,18 +598,18 @@ actor SDLContextActor {
} }
// //
// public func flowReportTask() { // public func flowReportTask() {
// Task { // Task {
// // // //
// self.flowTracerCancel = Timer.publish(every: 60.0, on: .main, in: .common).autoconnect() // self.flowTracerCancel = Timer.publish(every: 60.0, on: .main, in: .common).autoconnect()
// .sink { _ in // .sink { _ in
// Task { // Task {
// let (forwardNum, p2pNum, inboundNum) = await self.flowTracer.reset() // let (forwardNum, p2pNum, inboundNum) = await self.flowTracer.reset()
// await self.superClient?.flowReport(forwardNum: forwardNum, p2pNum: p2pNum, inboundNum: inboundNum) // await self.superClient?.flowReport(forwardNum: forwardNum, p2pNum: p2pNum, inboundNum: inboundNum)
// } // }
// } // }
// } // }
// } // }
// , 线packetFlow // , 线packetFlow
private func startReader() { private func startReader() {
@ -663,9 +662,9 @@ actor SDLContextActor {
} }
else { else {
SDLLogger.shared.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast", level: .debug) SDLLogger.shared.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast", level: .debug)
// // arp广 // // arp广
// let arpReqeust = ARPPacket.arpRequest(senderIP: networkAddr.ip, senderMAC: networkAddr.mac, targetIP: dstIp) // let arpReqeust = ARPPacket.arpRequest(senderIP: networkAddr.ip, senderMAC: networkAddr.mac, targetIP: dstIp)
// await self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal()) // await self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal())
try? await self.arpServer.arpRequest(targetIp: dstIp, use: self.quicClient) try? await self.arpServer.arpRequest(targetIp: dstIp, use: self.quicClient)
} }

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()
}
}