add callbacks

This commit is contained in:
anlicheng 2025-07-15 18:27:40 +08:00
parent db6b90bf55
commit 93ab2712a8
2 changed files with 36 additions and 63 deletions

View File

@ -22,7 +22,7 @@ class SDLSuperClient: ChannelInboundHandler, @unchecked Sendable {
// id // id
var idGenerator = SDLIdGenerator(seed: 1) var idGenerator = SDLIdGenerator(seed: 1)
private let callbackManager = SuperCallbackManager() private var callbackManager = SuperCallbackManager()
let host: String let host: String
let port: Int let port: Int
@ -248,43 +248,30 @@ extension SDLSuperClient {
// //
extension SDLSuperClient { extension SDLSuperClient {
private final class SuperCallbackManager {
private struct SuperCallbackManager {
// //
private var callbacks: [UInt32:CallbackFun] = [:] private var callbacks: [UInt32:CallbackFun] = [:]
private let locker = NSLock()
func addCallback(id: UInt32, callback: @escaping CallbackFun) { mutating func addCallback(id: UInt32, callback: @escaping CallbackFun) {
locker.lock()
defer {
locker.unlock()
}
self.callbacks[id] = callback self.callbacks[id] = callback
} }
func fireCallback(message: SDLSuperInboundMessage) { mutating func fireCallback(message: SDLSuperInboundMessage) {
locker.lock()
defer {
locker.unlock()
}
if let callback = self.callbacks[message.msgId] { if let callback = self.callbacks[message.msgId] {
callback(message) callback(message)
self.callbacks.removeValue(forKey: message.msgId) self.callbacks.removeValue(forKey: message.msgId)
} }
} }
func fireAllCallbacks(message: SDLSuperInboundMessage) { mutating func fireAllCallbacks(message: SDLSuperInboundMessage) {
locker.lock()
defer {
locker.unlock()
}
for (_, callback) in self.callbacks { for (_, callback) in self.callbacks {
callback(nil) callback(nil)
} }
self.callbacks.removeAll() self.callbacks.removeAll()
} }
} }
} }
// --MARK: // --MARK:
@ -371,3 +358,11 @@ extension SDLSuperClient {
} }
} }
extension ByteToMessageHandler: @unchecked @retroactive Sendable {
}
extension MessageToByteHandler: @unchecked @retroactive Sendable {
}

View File

@ -21,7 +21,7 @@ class SDLUDPHole: ChannelInboundHandler, @unchecked Sendable {
private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
private var cookieGenerator = SDLIdGenerator(seed: 1) private var cookieGenerator = SDLIdGenerator(seed: 1)
private let callbackManager = HoleCallbackManager() private var callbackManager = HoleCallbackManager()
public var localAddress: SocketAddress? public var localAddress: SocketAddress?
public var channel: Channel? public var channel: Channel?
@ -81,7 +81,7 @@ class SDLUDPHole: ChannelInboundHandler, @unchecked Sendable {
SDLLogger.log("[SDLUDPHole] stunProbe: \(remoteAddress)", level: .warning) SDLLogger.log("[SDLUDPHole] stunProbe: \(remoteAddress)", level: .warning)
self.callbackManager.addCallback(id: cookie, timeout: timeout, callback: callback) self.callbackManager.addCallback(id: cookie, callback: callback)
} }
// MARK: client-client apis // MARK: client-client apis
@ -270,59 +270,37 @@ extension SDLUDPHole {
// --MARK: // --MARK:
extension SDLUDPHole { extension SDLUDPHole {
private final class HoleCallbackManager { private struct HoleCallbackManager {
// //
private var callbacks: [UInt32:CallbackFun] = [:] private var callbacks: [UInt32: CallbackFun] = [:]
private let locker = NSLock()
func addCallback(id: UInt32, timeout: Int, callback: @escaping CallbackFun) { //private var timeoutCallbacks: [UInt32: CallbackFun] = [:]
locker.lock()
defer {
locker.unlock()
}
DispatchQueue.global().asyncAfter(deadline: .now() + Double(timeout)) {
self.fireCallback(cookie: id)
}
//
mutating func addCallback(id: UInt32, callback: @escaping CallbackFun) {
//
self.callbacks[id] = callback self.callbacks[id] = callback
} }
func fireCallback(message: SDLStunProbeReply) { //
locker.lock() mutating func fireCallback(message: SDLStunProbeReply) {
defer { let id = message.cookie
locker.unlock() //
} if let callback = callbacks[id] {
if let callback = self.callbacks[message.cookie] {
callback(message) callback(message)
self.callbacks.removeValue(forKey: message.cookie) self.callbacks.removeValue(forKey: id)
} }
} }
func fireAllCallbacks(message: SDLSuperInboundMessage) { //
locker.lock() mutating func fireAllCallbacks(message: SDLSuperInboundMessage) {
defer { //
locker.unlock() for callback in callbacks.values {
}
for (_, callback) in self.callbacks {
callback(nil) callback(nil)
} }
self.callbacks.removeAll() self.callbacks.removeAll()
} }
private func fireCallback(cookie: UInt32) {
locker.lock()
defer {
locker.unlock()
} }
if let callback = self.callbacks[cookie] {
callback(nil)
self.callbacks.removeValue(forKey: cookie)
}
}
}
} }