punchnet-macos/Tun/Punchnet/Actors/SDLPuncherActor.swift
2026-02-15 00:34:40 +08:00

93 lines
3.0 KiB
Swift

//
// SDLPuncherActor.swift
// Tun
//
// Created by on 2026/1/7.
//
import Foundation
import NIOCore
actor SDLPuncherActor {
nonisolated private let cooldown: Duration = .seconds(5)
// dstMac
private var coolingDown: Set<Data> = []
private var pktId: UInt32 = 1
//
private var pendingRequests: [UInt32: RegisterRequest] = [:]
// holer
nonisolated private let querySocketAddress: SocketAddress
struct RegisterRequest {
let srcMac: Data
let dstMac: Data
let networkId: UInt32
}
init(querySocketAddress: SocketAddress) {
self.querySocketAddress = querySocketAddress
}
func submitRegisterRequest(using udpHole: SDLUDPHole?, request: RegisterRequest) {
let dstMac = request.dstMac
guard let udpHole, !coolingDown.contains(dstMac) else {
return
}
//
coolingDown.insert(dstMac)
let pktId = self.pktId
self.pktId &+= 1
if self.pktId == 0 {
self.pktId = 1
}
//self.tryHole(using: udpHole, pktId: pktId, request: request)
Task {
//
try? await Task.sleep(for: .seconds(5))
self.endCooldown(for: dstMac)
self.removePendingRequest(for: pktId)
}
}
// func handlePeerInfo(using udpHole: SDLUDPHole, peerInfo: SDLPeerInfo) async {
// if let request = pendingRequests.removeValue(forKey: peerInfo.pktID) {
// if let remoteAddress = try? await peerInfo.v4Info.socketAddress() {
// SDLLogger.shared.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug)
// // register
// var register = SDLRegister()
// register.networkID = request.networkId
// register.srcMac = request.srcMac
// register.dstMac = request.dstMac
//
// udpHole.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress)
// } else {
// SDLLogger.shared.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
// }
// }
// }
private func endCooldown(for key: Data) {
self.coolingDown.remove(key)
}
private func removePendingRequest(for pktId: UInt32) {
self.pendingRequests.removeValue(forKey: pktId)
}
// private func tryHole(using udpHole: SDLUDPHole, pktId: UInt32, request: RegisterRequest) {
// var queryInfo = SDLQueryInfo()
// queryInfo.pktID = pktId
// queryInfo.dstMac = request.dstMac
// self.pendingRequests[pktId] = request
//
// if let queryData = try? queryInfo.serializedData() {
// udpHole.send(type: .queryInfo, data: queryData, remoteAddress: self.querySocketAddress)
// }
// }
}