Better timeouts
This commit is contained in:
parent
6cd8f79e8b
commit
c6a6d952e6
@ -131,15 +131,10 @@ open class SocketEngine:
|
||||
|
||||
private let url: URL
|
||||
|
||||
private var lastCommunication: Date?
|
||||
private var pingInterval: Int?
|
||||
private var pingTimeout = 0 {
|
||||
didSet {
|
||||
pingsMissedMax = Int(pingTimeout / (pingInterval ?? 25000))
|
||||
}
|
||||
}
|
||||
private var pingTimeout = 0
|
||||
|
||||
private var pingsMissed = 0
|
||||
private var pingsMissedMax = 0
|
||||
private var probeWait = ProbeWaitQueue()
|
||||
private var secure = false
|
||||
private var certPinner: CertificatePinning?
|
||||
@ -418,7 +413,6 @@ open class SocketEngine:
|
||||
|
||||
self.sid = sid
|
||||
connected = true
|
||||
pingsMissed = 0
|
||||
|
||||
if let upgrades = json["upgrades"] as? [String] {
|
||||
upgradeWs = upgrades.contains("websocket")
|
||||
@ -454,8 +448,6 @@ open class SocketEngine:
|
||||
}
|
||||
|
||||
private func handlePing(with message: String) {
|
||||
pingsMissed = 0
|
||||
|
||||
write("", withType: .pong, withData: [])
|
||||
|
||||
client?.engineDidReceivePing()
|
||||
@ -463,16 +455,16 @@ open class SocketEngine:
|
||||
|
||||
private func checkPings() {
|
||||
let pingInterval = self.pingInterval ?? 25_000
|
||||
let deadlineMs = Double(pingInterval + pingTimeout) / 1000
|
||||
let timeoutDeadline = DispatchTime.now() + .milliseconds(pingInterval + pingTimeout)
|
||||
|
||||
engineQueue.asyncAfter(deadline: .now() + .milliseconds(pingInterval)) {[weak self, id = self.sid] in
|
||||
engineQueue.asyncAfter(deadline: timeoutDeadline) {[weak self, id = self.sid] in
|
||||
// Make sure not to ping old connections
|
||||
guard let this = self, this.sid == id else { return }
|
||||
|
||||
if this.pingsMissed > this.pingsMissedMax {
|
||||
if abs(this.lastCommunication?.timeIntervalSinceNow ?? deadlineMs) >= deadlineMs {
|
||||
this.closeOutEngine(reason: "Ping timeout")
|
||||
} else {
|
||||
this.pingsMissed += 1
|
||||
|
||||
this.checkPings()
|
||||
}
|
||||
}
|
||||
@ -484,6 +476,8 @@ open class SocketEngine:
|
||||
open func parseEngineData(_ data: Data) {
|
||||
DefaultSocketLogger.Logger.log("Got binary data: \(data)", type: SocketEngine.logType)
|
||||
|
||||
lastCommunication = Date()
|
||||
|
||||
client?.parseEngineBinaryData(data)
|
||||
}
|
||||
|
||||
@ -491,6 +485,8 @@ open class SocketEngine:
|
||||
///
|
||||
/// - parameter message: The message to parse.
|
||||
open func parseEngineMessage(_ message: String) {
|
||||
lastCommunication = Date()
|
||||
|
||||
DefaultSocketLogger.Logger.log("Got message: \(message)", type: SocketEngine.logType)
|
||||
|
||||
let reader = SocketStringReader(message: message)
|
||||
@ -540,28 +536,6 @@ open class SocketEngine:
|
||||
waitingForPost = false
|
||||
}
|
||||
|
||||
private func sendPing() {
|
||||
guard connected, let pingInterval = pingInterval else { return }
|
||||
|
||||
// Server is not responding
|
||||
if pingsMissed > pingsMissedMax {
|
||||
closeOutEngine(reason: "Ping timeout")
|
||||
return
|
||||
}
|
||||
|
||||
pingsMissed += 1
|
||||
write("", withType: .ping, withData: [], completion: nil)
|
||||
|
||||
engineQueue.asyncAfter(deadline: .now() + .milliseconds(pingInterval)) {[weak self, id = self.sid] in
|
||||
// Make sure not to ping old connections
|
||||
guard let this = self, this.sid == id else { return }
|
||||
|
||||
this.sendPing()
|
||||
}
|
||||
|
||||
client?.engineDidSendPong()
|
||||
}
|
||||
|
||||
/// Called when the engine should set/update its configs from a given configuration.
|
||||
///
|
||||
/// parameter config: The `SocketIOClientConfiguration` that should be used to set/update configs.
|
||||
@ -713,8 +687,6 @@ extension SocketEngine {
|
||||
wsConnected = true
|
||||
client?.engineDidWebsocketUpgrade(headers: headers)
|
||||
websocketDidConnect()
|
||||
case let .error(err):
|
||||
print(err)
|
||||
case .cancelled:
|
||||
wsConnected = false
|
||||
websocketDidDisconnect(error: EngineError.canceled)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user