fix session
This commit is contained in:
parent
8383743f2c
commit
6e0e40c398
36
Tun/Punchnet/Session/Session.swift
Normal file
36
Tun/Punchnet/Session/Session.swift
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
//
|
||||||
|
// Session.swift
|
||||||
|
// sdlan
|
||||||
|
// Session是增加了有效时间的
|
||||||
|
// Created by 安礼成 on 2025/7/14.
|
||||||
|
//
|
||||||
|
import Foundation
|
||||||
|
import NIOCore
|
||||||
|
|
||||||
|
struct Session {
|
||||||
|
enum AddressType: String, Hashable {
|
||||||
|
case v4
|
||||||
|
case v6
|
||||||
|
}
|
||||||
|
|
||||||
|
// 在内部的通讯的ip地址, 整数格式
|
||||||
|
let dstMac: Data
|
||||||
|
// 对端的主机在nat上映射的端口信息
|
||||||
|
let natAddress: SocketAddress
|
||||||
|
// 当前会话对应的外层地址族
|
||||||
|
let addressType: AddressType
|
||||||
|
|
||||||
|
// 最后使用时间
|
||||||
|
var lastTimestamp: Int32
|
||||||
|
|
||||||
|
init?(dstMac: Data, natAddress: SocketAddress, addressType: AddressType) {
|
||||||
|
self.dstMac = dstMac
|
||||||
|
self.natAddress = natAddress
|
||||||
|
self.addressType = addressType
|
||||||
|
self.lastTimestamp = Int32(Date().timeIntervalSince1970)
|
||||||
|
}
|
||||||
|
|
||||||
|
mutating func updateLastTimestamp(_ lastTimestamp: Int32) {
|
||||||
|
self.lastTimestamp = lastTimestamp
|
||||||
|
}
|
||||||
|
}
|
||||||
27
Tun/Punchnet/Session/SessionSnapshot.swift
Normal file
27
Tun/Punchnet/Session/SessionSnapshot.swift
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
//
|
||||||
|
// SessionSnapshot.swift
|
||||||
|
// Tun
|
||||||
|
//
|
||||||
|
// Created by Codex on 2026/5/21.
|
||||||
|
//
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
final class SessionSnapshot: Snapshot {
|
||||||
|
private let sessions: [Data: [Session.AddressType: Session]]
|
||||||
|
|
||||||
|
init(sessions: [Data: [Session.AddressType: Session]]) {
|
||||||
|
self.sessions = sessions
|
||||||
|
}
|
||||||
|
|
||||||
|
func getSession(toAddress: Data) -> Session? {
|
||||||
|
guard let peerSessions = self.sessions[toAddress] else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return peerSessions.values.max(by: { $0.lastTimestamp < $1.lastTimestamp })
|
||||||
|
}
|
||||||
|
|
||||||
|
static func empty() -> SessionSnapshot {
|
||||||
|
return SessionSnapshot(sessions: [:])
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,60 +1,10 @@
|
|||||||
//
|
//
|
||||||
// Session.swift
|
// SessionTable.swift
|
||||||
// sdlan
|
// Tun
|
||||||
// Session是增加了有效时间的
|
//
|
||||||
// Created by 安礼成 on 2025/7/14.
|
// Created by Codex on 2026/5/21.
|
||||||
//
|
//
|
||||||
import Foundation
|
import Foundation
|
||||||
import NIOCore
|
|
||||||
import Darwin
|
|
||||||
|
|
||||||
struct Session {
|
|
||||||
enum AddressType: String, Hashable {
|
|
||||||
case v4
|
|
||||||
case v6
|
|
||||||
}
|
|
||||||
|
|
||||||
// 在内部的通讯的ip地址, 整数格式
|
|
||||||
let dstMac: Data
|
|
||||||
// 对端的主机在nat上映射的端口信息
|
|
||||||
let natAddress: SocketAddress
|
|
||||||
// 当前会话对应的外层地址族
|
|
||||||
let addressType: AddressType
|
|
||||||
|
|
||||||
// 最后使用时间
|
|
||||||
var lastTimestamp: Int32
|
|
||||||
|
|
||||||
init?(dstMac: Data, natAddress: SocketAddress, addressType: AddressType) {
|
|
||||||
self.dstMac = dstMac
|
|
||||||
self.natAddress = natAddress
|
|
||||||
self.addressType = addressType
|
|
||||||
self.lastTimestamp = Int32(Date().timeIntervalSince1970)
|
|
||||||
}
|
|
||||||
|
|
||||||
mutating func updateLastTimestamp(_ lastTimestamp: Int32) {
|
|
||||||
self.lastTimestamp = lastTimestamp
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final class SessionSnapshot: Snapshot {
|
|
||||||
private let sessions: [Data: [Session.AddressType: Session]]
|
|
||||||
|
|
||||||
init(sessions: [Data: [Session.AddressType: Session]]) {
|
|
||||||
self.sessions = sessions
|
|
||||||
}
|
|
||||||
|
|
||||||
func getSession(toAddress: Data) -> Session? {
|
|
||||||
guard let peerSessions = self.sessions[toAddress] else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return peerSessions.values.max(by: { $0.lastTimestamp < $1.lastTimestamp })
|
|
||||||
}
|
|
||||||
|
|
||||||
static func empty() -> SessionSnapshot {
|
|
||||||
return SessionSnapshot(sessions: [:])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
actor SessionManager {
|
actor SessionManager {
|
||||||
private var sessions: [Data: [Session.AddressType: Session]] = [:]
|
private var sessions: [Data: [Session.AddressType: Session]] = [:]
|
||||||
@ -141,5 +91,4 @@ actor SessionManager {
|
|||||||
}
|
}
|
||||||
return SessionSnapshot(sessions: sessions)
|
return SessionSnapshot(sessions: sessions)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user