// // SDLPuncherActor.swift // Tun // // Created by 安礼成 on 2026/1/7. // import Foundation actor SDLPuncherActor { // dstMac private var coolingDown: Set = [] private let cooldown: Duration = .seconds(5) private var udpHoleActor: SDLUDPHoleActor? // 处理holer private var logger: SDLLogger struct RegisterRequest { let srcMac: Data let dstMac: Data let networkId: UInt32 } init(logger: SDLLogger) { self.logger = logger } func setUDPHoleActor(udpHoleActor: SDLUDPHoleActor?) { self.udpHoleActor = udpHoleActor } func submitRegisterRequest(request: RegisterRequest) { let dstMac = request.dstMac guard !coolingDown.contains(dstMac) else { return } // 触发一次打洞 coolingDown.insert(dstMac) Task { await self.tryHole(request: request) // 启动冷却期 try? await Task.sleep(for: .seconds(5)) self.endCooldown(for: dstMac) } } private func endCooldown(for key: Data) { self.coolingDown.remove(key) } private func tryHole(request: RegisterRequest) async { // var queryInfo = SDLQueryInfo() // queryInfo.dstMac = request.dstMac // guard let message = try? await self.superClientActor?.request(type: .queryInfo, data: try queryInfo.serializedData()) else { // return // } // // switch message.packet { // case .empty: // self.logger.log("[SDLContext] hole query_info get empty: \(message)", level: .debug) // case .peerInfo(let peerInfo): // if let remoteAddress = peerInfo.v4Info.socketAddress() { // self.logger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug) // // 发送register包 // var register = SDLRegister() // register.networkID = request.networkId // register.srcMac = request.srcMac // register.dstMac = request.dstMac // // await self.udpHoleActor?.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress) // } else { // self.logger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning) // } // default: // self.logger.log("[SDLContext] hole query_info is packet: \(message)", level: .warning) // } } }