// // SDLContextSupervisor.swift // Tun // // Created by 安礼成 on 2026/2/2. // import Foundation import NetworkExtension actor SDLContextSupervisor { private var context: SDLContextActor? private var tasks: [Task] = [] 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 { return Task.detached { while !Task.isCancelled { do { try await body() } catch is CancellationError { break } catch { try? await Task.sleep(nanoseconds: 2_000_000_000) } } } } }