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
var idGenerator = SDLIdGenerator(seed: 1)
private let callbackManager = SuperCallbackManager()
private var callbackManager = SuperCallbackManager()
let host: String
let port: Int
@ -248,43 +248,30 @@ extension SDLSuperClient {
//
extension SDLSuperClient {
private final class SuperCallbackManager {
private struct SuperCallbackManager {
//
private var callbacks: [UInt32:CallbackFun] = [:]
private let locker = NSLock()
func addCallback(id: UInt32, callback: @escaping CallbackFun) {
locker.lock()
defer {
locker.unlock()
}
mutating func addCallback(id: UInt32, callback: @escaping CallbackFun) {
self.callbacks[id] = callback
}
func fireCallback(message: SDLSuperInboundMessage) {
locker.lock()
defer {
locker.unlock()
}
mutating func fireCallback(message: SDLSuperInboundMessage) {
if let callback = self.callbacks[message.msgId] {
callback(message)
self.callbacks.removeValue(forKey: message.msgId)
}
}
func fireAllCallbacks(message: SDLSuperInboundMessage) {
locker.lock()
defer {
locker.unlock()
}
mutating func fireAllCallbacks(message: SDLSuperInboundMessage) {
for (_, callback) in self.callbacks {
callback(nil)
}
self.callbacks.removeAll()
}
}
}
// --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 var cookieGenerator = SDLIdGenerator(seed: 1)
private let callbackManager = HoleCallbackManager()
private var callbackManager = HoleCallbackManager()
public var localAddress: SocketAddress?
public var channel: Channel?
@ -81,7 +81,7 @@ class SDLUDPHole: ChannelInboundHandler, @unchecked Sendable {
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
@ -270,59 +270,37 @@ extension SDLUDPHole {
// --MARK:
extension SDLUDPHole {
private final class HoleCallbackManager {
//
private var callbacks: [UInt32:CallbackFun] = [:]
private let locker = NSLock()
private struct HoleCallbackManager {
//
private var callbacks: [UInt32: CallbackFun] = [:]
func addCallback(id: UInt32, timeout: Int, callback: @escaping CallbackFun) {
locker.lock()
defer {
locker.unlock()
}
DispatchQueue.global().asyncAfter(deadline: .now() + Double(timeout)) {
self.fireCallback(cookie: id)
}
//private var timeoutCallbacks: [UInt32: CallbackFun] = [:]
//
mutating func addCallback(id: UInt32, callback: @escaping CallbackFun) {
//
self.callbacks[id] = callback
}
func fireCallback(message: SDLStunProbeReply) {
locker.lock()
defer {
locker.unlock()
}
if let callback = self.callbacks[message.cookie] {
//
mutating func fireCallback(message: SDLStunProbeReply) {
let id = message.cookie
//
if let callback = callbacks[id] {
callback(message)
self.callbacks.removeValue(forKey: message.cookie)
self.callbacks.removeValue(forKey: id)
}
}
func fireAllCallbacks(message: SDLSuperInboundMessage) {
locker.lock()
defer {
locker.unlock()
}
for (_, callback) in self.callbacks {
//
mutating func fireAllCallbacks(message: SDLSuperInboundMessage) {
//
for callback in callbacks.values {
callback(nil)
}
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)
}
}
}
}