fix super event
This commit is contained in:
parent
75d7761896
commit
a8f0bc7804
@ -625,6 +625,10 @@ actor SDLContextActor {
|
||||
// 处理和Super之间的通讯
|
||||
extension SDLContextActor {
|
||||
|
||||
private func makeSuperEventProcessor() -> SDLSuperEventProcessor {
|
||||
return .init(networkAddress: self.config.networkAddress)
|
||||
}
|
||||
|
||||
// 开启注册任务
|
||||
private func startRegisterLoop() {
|
||||
guard self.registerTask == nil else {
|
||||
@ -711,32 +715,21 @@ extension SDLContextActor {
|
||||
}
|
||||
|
||||
private func handleEvent(event: SDLEvent) async {
|
||||
switch event.event {
|
||||
case .natChanged(let natChangedEvent):
|
||||
let dstMac = natChangedEvent.mac
|
||||
SDLLogger.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)")
|
||||
sessionManager.removeSession(dstMac: dstMac)
|
||||
case .sendRegister(let sendRegisterEvent):
|
||||
SDLLogger.log("[SDLContext] sendRegisterEvent, ip: \(sendRegisterEvent)")
|
||||
// 发送register包
|
||||
var register = SDLRegister()
|
||||
register.networkID = self.config.networkAddress.networkId
|
||||
register.srcMac = self.config.networkAddress.mac
|
||||
register.dstMac = sendRegisterEvent.dstMac
|
||||
let registerData = try! register.serializedData()
|
||||
|
||||
if sendRegisterEvent.natIp > 0 && sendRegisterEvent.natPort > 0 {
|
||||
let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp)
|
||||
if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(sendRegisterEvent.natPort)) {
|
||||
self.sendPeerPacket(type: .register, data: registerData, remoteAddress: remoteAddress)
|
||||
}
|
||||
}
|
||||
|
||||
if sendRegisterEvent.hasV6Info, let remoteAddress = try? await sendRegisterEvent.v6Info.socketAddress() {
|
||||
let processor = self.makeSuperEventProcessor()
|
||||
let plan = await processor.makeProcessingPlan(event: event)
|
||||
if let logMessage = plan.logMessage {
|
||||
SDLLogger.log(logMessage)
|
||||
}
|
||||
|
||||
switch plan.action {
|
||||
case .removeSession(let dstMac):
|
||||
self.sessionManager.removeSession(dstMac: dstMac)
|
||||
case .sendRegister(let registerData, let remoteAddresses):
|
||||
remoteAddresses.forEach { remoteAddress in
|
||||
self.sendPeerPacket(type: .register, data: registerData, remoteAddress: remoteAddress)
|
||||
}
|
||||
case .shutdown(let shutdownEvent):
|
||||
let alertNotice = NoticeMessage.alert(alert: shutdownEvent.message)
|
||||
case .shutdown(let message):
|
||||
let alertNotice = NoticeMessage.alert(alert: message)
|
||||
self.noticeClient?.send(data: alertNotice)
|
||||
|
||||
// 报告错误并退出
|
||||
|
||||
72
Tun/Punchnet/Actors/SDLSuperEventProcessor.swift
Normal file
72
Tun/Punchnet/Actors/SDLSuperEventProcessor.swift
Normal file
@ -0,0 +1,72 @@
|
||||
//
|
||||
// SDLSuperEventProcessor.swift
|
||||
// Tun
|
||||
//
|
||||
// Created by 安礼成 on 2026/4/15.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import NIOCore
|
||||
|
||||
final class SDLSuperEventProcessor {
|
||||
enum ProcessingAction {
|
||||
case removeSession(dstMac: Data)
|
||||
case sendRegister(data: Data, remoteAddresses: [SocketAddress])
|
||||
case shutdown(message: String)
|
||||
case none
|
||||
}
|
||||
|
||||
struct ProcessingPlan {
|
||||
let logMessage: String?
|
||||
let action: ProcessingAction
|
||||
}
|
||||
|
||||
private let networkAddress: SDLConfiguration.NetworkAddress
|
||||
|
||||
init(networkAddress: SDLConfiguration.NetworkAddress) {
|
||||
self.networkAddress = networkAddress
|
||||
}
|
||||
|
||||
func makeProcessingPlan(event: SDLEvent) async -> ProcessingPlan {
|
||||
switch event.event {
|
||||
case .natChanged(let natChangedEvent):
|
||||
let dstMac = natChangedEvent.mac
|
||||
return .init(
|
||||
logMessage: "[SDLContext] natChangedEvent, dstMac: \(dstMac)",
|
||||
action: .removeSession(dstMac: dstMac)
|
||||
)
|
||||
case .sendRegister(let sendRegisterEvent):
|
||||
return await self.makeSendRegisterPlan(sendRegisterEvent)
|
||||
case .shutdown(let shutdownEvent):
|
||||
return .init(logMessage: nil, action: .shutdown(message: shutdownEvent.message))
|
||||
case .none:
|
||||
return .init(logMessage: nil, action: .none)
|
||||
}
|
||||
}
|
||||
|
||||
private func makeSendRegisterPlan(_ event: SDLEvent.SendRegister) async -> ProcessingPlan {
|
||||
// 发送register包
|
||||
var register = SDLRegister()
|
||||
register.networkID = self.networkAddress.networkId
|
||||
register.srcMac = self.networkAddress.mac
|
||||
register.dstMac = event.dstMac
|
||||
let registerData = try! register.serializedData()
|
||||
|
||||
var remoteAddresses: [SocketAddress] = []
|
||||
if event.natIp > 0 && event.natPort > 0 {
|
||||
let address = SDLUtil.int32ToIp(event.natIp)
|
||||
if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(event.natPort)) {
|
||||
remoteAddresses.append(remoteAddress)
|
||||
}
|
||||
}
|
||||
|
||||
if event.hasV6Info, let remoteAddress = try? await event.v6Info.socketAddress() {
|
||||
remoteAddresses.append(remoteAddress)
|
||||
}
|
||||
|
||||
return .init(
|
||||
logMessage: "[SDLContext] sendRegisterEvent, ip: \(event)",
|
||||
action: .sendRegister(data: registerData, remoteAddresses: remoteAddresses)
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user