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