73 lines
2.4 KiB
Swift
73 lines
2.4 KiB
Swift
//
|
|
// 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)
|
|
)
|
|
}
|
|
}
|