add callbacks
This commit is contained in:
parent
db6b90bf55
commit
93ab2712a8
@ -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 {
|
||||
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user