diff --git a/Tun/Super/SDLSuperService.swift b/Tun/Super/SDLSuperService.swift index a02a368..b255757 100644 --- a/Tun/Super/SDLSuperService.swift +++ b/Tun/Super/SDLSuperService.swift @@ -110,31 +110,3 @@ actor SDLSuperService { } } -actor SDLSuperServiceProxy { - private var superService: SDLSuperService? - private var generation: UInt64 = 0 - - func replace(_ superService: SDLSuperService?) async { - self.generation &+= 1 - - let oldSuperService = self.superService - self.superService = superService - - if oldSuperService !== superService { - await oldSuperService?.stop() - } - } - - func stop() async { - self.generation &+= 1 - - let superService = self.superService - self.superService = nil - - await superService?.stop() - } - - func send(type: SDLPacketType, data: Data) async { - await self.superService?.send(type: type, data: data) - } -} diff --git a/Tun/Super/SDLSuperServiceProxy.swift b/Tun/Super/SDLSuperServiceProxy.swift new file mode 100644 index 0000000..aeb9360 --- /dev/null +++ b/Tun/Super/SDLSuperServiceProxy.swift @@ -0,0 +1,36 @@ +// +// SDLSuperServiceProxy.swift +// punchnet +// +// Created by 安礼成 on 2026/5/21. +// +import Foundation + +actor SDLSuperServiceProxy { + private var superService: SDLSuperService? + private var generation: UInt64 = 0 + + func replace(_ superService: SDLSuperService?) async { + self.generation &+= 1 + + let oldSuperService = self.superService + self.superService = superService + + if oldSuperService !== superService { + await oldSuperService?.stop() + } + } + + func stop() async { + self.generation &+= 1 + + let superService = self.superService + self.superService = nil + + await superService?.stop() + } + + func send(type: SDLPacketType, data: Data) async { + await self.superService?.send(type: type, data: data) + } +} diff --git a/Tun/UDPHole/SDLUDPHoleService.swift b/Tun/UDPHole/SDLUDPHoleService.swift index 2f8fedb..9f13891 100644 --- a/Tun/UDPHole/SDLUDPHoleService.swift +++ b/Tun/UDPHole/SDLUDPHoleService.swift @@ -251,49 +251,3 @@ actor SDLUDPHoleService { } } } - -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) - } -} diff --git a/Tun/UDPHole/SDLUDPHoleServiceProxy.swift b/Tun/UDPHole/SDLUDPHoleServiceProxy.swift new file mode 100644 index 0000000..e4c7aa7 --- /dev/null +++ b/Tun/UDPHole/SDLUDPHoleServiceProxy.swift @@ -0,0 +1,54 @@ +// +// 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) + } +}