fix context

This commit is contained in:
anlicheng 2025-08-01 23:37:19 +08:00
parent 29b9bebe87
commit 0fe9b43c08

View File

@ -78,6 +78,7 @@ public class SDLContext: @unchecked Sendable {
// holer // holer
private var holerPublishers: [Data:PassthroughSubject<RegisterRequest, Never>] = [:] private var holerPublishers: [Data:PassthroughSubject<RegisterRequest, Never>] = [:]
private var bag = Set<AnyCancellable>() private var bag = Set<AnyCancellable>()
private var locker = NSLock()
struct RegisterRequest { struct RegisterRequest {
let srcMac: Data let srcMac: Data
@ -492,7 +493,7 @@ public class SDLContext: @unchecked Sendable {
else { else {
// arp // arp
let broadcastMac = Data([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]) let broadcastMac = Data([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
let arpReqeust: ARPPacket = ARPPacket.arpRequest(senderIP: self.devAddr.netAddr, senderMAC: self.devAddr.mac, targetIP: dstIp) let arpReqeust = ARPPacket.arpRequest(senderIP: self.devAddr.netAddr, senderMAC: self.devAddr.mac, targetIP: dstIp)
await self.routeLayerPacket(dstMac: broadcastMac, type: .arp, data: arpReqeust.marshal()) await self.routeLayerPacket(dstMac: broadcastMac, type: .arp, data: arpReqeust.marshal())
NSLog("[SDLContext] dstIp: \(dstIp) arp query not found") NSLog("[SDLContext] dstIp: \(dstIp) arp query not found")
@ -528,19 +529,26 @@ public class SDLContext: @unchecked Sendable {
// //
let registerRequest = RegisterRequest(srcMac: self.devAddr.mac, dstMac: dstMac, networkId: self.devAddr.networkID) let registerRequest = RegisterRequest(srcMac: self.devAddr.mac, dstMac: dstMac, networkId: self.devAddr.networkID)
self.submitRegisterRequest(dstMac: dstMac, request: registerRequest) self.submitRegisterRequest(request: registerRequest)
} }
} }
private func submitRegisterRequest(dstMac: Data, request: RegisterRequest) { private func submitRegisterRequest(request: RegisterRequest) {
self.locker.lock()
defer {
self.locker.unlock()
}
let dstMac = request.dstMac
if let publisher = self.holerPublishers[dstMac] { if let publisher = self.holerPublishers[dstMac] {
publisher.send(request) publisher.send(request)
} else { } else {
let publisher = PassthroughSubject<RegisterRequest, Never>() let publisher = PassthroughSubject<RegisterRequest, Never>()
publisher.debounce(for: .seconds(5), scheduler: DispatchQueue.global()) publisher.debounce(for: .seconds(5), scheduler: DispatchQueue.global())
.sink { request in .sink { request in
self.tryHole(request: request) Task {
await self.tryHole(request: request)
}
} }
.store(in: &self.bag) .store(in: &self.bag)
@ -548,8 +556,7 @@ public class SDLContext: @unchecked Sendable {
} }
} }
private func tryHole(request: RegisterRequest) { private func tryHole(request: RegisterRequest) async {
Task {
guard let message = try? await self.superClient?.queryInfo(dst_mac: request.dstMac).get() else { guard let message = try? await self.superClient?.queryInfo(dst_mac: request.dstMac).get() else {
return return
} }
@ -569,7 +576,6 @@ public class SDLContext: @unchecked Sendable {
SDLLogger.log("[SDLContext] hole query_info is packet: \(message)", level: .warning) SDLLogger.log("[SDLContext] hole query_info is packet: \(message)", level: .warning)
} }
} }
}
deinit { deinit {
self.stunCancel?.cancel() self.stunCancel?.cancel()