55 lines
1.5 KiB
Swift
55 lines
1.5 KiB
Swift
//
|
|
// SDLUDPHoleServiceProxy.swift
|
|
// punchnet
|
|
//
|
|
// Created by 安礼成 on 2026/5/21.
|
|
//
|
|
import Foundation
|
|
import NIOCore
|
|
|
|
actor SDLUDPHoleServiceProxy {
|
|
typealias ControlEventHandler = @Sendable (SDLUDPHoleService.Event) async -> Void
|
|
|
|
private var udpHoleService: SDLUDPHoleService?
|
|
private var generation: UInt64 = 0
|
|
|
|
func makeEventHandler(onControlEvent: @escaping ControlEventHandler) -> SDLUDPHoleService.EventHandler {
|
|
self.generation &+= 1
|
|
let generation = self.generation
|
|
|
|
return { [weak self] event in
|
|
await self?.handleEvent(event, generation: generation, onControlEvent: onControlEvent)
|
|
}
|
|
}
|
|
|
|
func replace(_ udpHoleService: SDLUDPHoleService?) async {
|
|
let oldUDPHoleService = self.udpHoleService
|
|
self.udpHoleService = udpHoleService
|
|
|
|
if oldUDPHoleService !== udpHoleService {
|
|
await oldUDPHoleService?.stop()
|
|
}
|
|
}
|
|
|
|
func stop() async {
|
|
self.generation &+= 1
|
|
|
|
let udpHoleService = self.udpHoleService
|
|
self.udpHoleService = nil
|
|
|
|
await udpHoleService?.stop()
|
|
}
|
|
|
|
func send(type: SDLPacketType, data: Data, remoteAddress: SocketAddress) async {
|
|
await self.udpHoleService?.send(type: type, data: data, remoteAddress: remoteAddress)
|
|
}
|
|
|
|
private func handleEvent(_ event: SDLUDPHoleService.Event, generation: UInt64, onControlEvent: ControlEventHandler) async {
|
|
guard generation == self.generation else {
|
|
return
|
|
}
|
|
|
|
await onControlEvent(event)
|
|
}
|
|
}
|