punchnet-macos/Tun/Punchnet/Actors/SDLContextSupervisor.swift
2026-02-02 12:07:29 +08:00

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